测评记录;
code:
#include "bits/stdc++.h"
using namespace std;
#define MAXM 4010000
#define MAXN 20100
struct EDGE{
int Next,To,Val;
}E[MAXM];
int Head[MAXN],Cur[MAXN],Size=1;
inline void Add(int From,int To,int Val){
E[++Size].Next=Head[From];
Head[From]=Size;
E[Size].Val=Val;
E[Size].To=To;
return;
}
bool Visited[MAXM];
int Dep[MAXN],Gap[MAXM],N,M,S,T;
inline void BFS(void){
for(register int i=1;i<=N;i++)
Dep[i]=-1;
queue <int> Queue;
Queue.push(T);
Dep[T]=0,Gap[0]=1;
while(!Queue.empty()){
int This=Queue.front();
Queue.pop();
for(register int i=Head[This];i;i=E[i].Next){
int To=E[i].To;
if(Dep[To]>=0)
continue;
Dep[To]=Dep[This]+1;
Gap[Dep[To]]++;
Queue.push(To);
}
}
return;
}
int Sum=0;
inline int DFS(int This,int F,int Flow){
if(This==T){
Visited[F]=true;
Sum+=Flow;
return Flow;
}
int Rlow=0,Used=0;
for(register int i=Cur[This];i;i=E[i].Next){
int To=E[i].To;Cur[This]=i;
if(E[i].Val<=0||(Dep[To]+1)!=Dep[This])
continue;
Rlow=DFS(To,This,min(Flow-Used,E[i].Val));
if(Rlow==0)continue;
E[i^1].Val=E[i^1].Val+Rlow;
E[i].Val=E[i].Val-Rlow;
Used=Used+Rlow;
if(Used==Flow)return Used;
}
Gap[Dep[This]]--;
if(Gap[Dep[This]]==0)
Dep[S]=N+1;
Dep[This]++;
Gap[Dep[This]]++;
return Used;
}
#define INF 1<<29
inline void ISAP(void){
BFS();
while(Dep[S]<N){
for(register int i=1;i<=N;i++)
Cur[i]=Head[i];
DFS(S,0,INF);
}
return;
}
int X,Y;
int main(void){
scanf("%d",&M);
for(register int i=1;i<=M;i++){
scanf("%d%d",&X,&Y);
Add(i,M+max(X,Y),1);
Add(M+max(X,Y),i,1);
Add(i,M+min(X,Y),1);
Add(M+min(X,Y),i,1);
N=max(N,max(X,Y));
}
S=M+N+1,T=M+N+2;
for(register int i=1;i<=M;i++)
Add(S,i,1),Add(i,S,0);
for(register int i=M+1;i<=(N+M);i++)
Add(i,T,1),Add(T,i,0);
N=T;
ISAP();
for(register int i=M+1;i<=N-2;i++){
if(Visited[i]==false){
cout<<i-M-1<<endl;
return 0;
}
}
return 0;
}