1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #define M 2000008 5 using namespace std; 6 int pi[M],n,m,f[M],i,head[M],next[M],u[M],cnt,tim; 7 bool xun(int a1) 8 { 9 for(int j=head[a1];j;j=next[j]) 10 if(f[u[j]]!=tim) 11 { 12 f[u[j]]=tim; 13 if(!pi[u[j]]||xun(pi[u[j]])) 14 { 15 pi[u[j]]=a1; 16 return 1; 17 } 18 } 19 return 0; 20 } 21 void jia(int a1,int a2) 22 { 23 cnt++; 24 next[cnt]=head[a1]; 25 head[a1]=cnt; 26 u[cnt]=a2; 27 return; 28 } 29 int main() 30 { 31 scanf("%d",&n); 32 for( i=1;i<=n;i++) 33 { 34 int a1,a2; 35 scanf("%d%d",&a1,&a2); 36 jia(a1,i); 37 jia(a2,i); 38 } 39 for( i=1;i<=10000;i++) 40 { 41 tim++; 42 if(!xun(i)) 43 break; 44 } 45 printf("%d\n",i-1); 46 }
属性与序号建边 跑二分图匹配。