POJ 3041 Asteroids
匈牙利二部匹配的裸题,算法思想我是懂了,但是代码为什么可以那样写我还没想明白。鉴于过几天要比赛了,所以先拿别人的模板来用。
1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 5 #include<math.h> 6 #include<algorithm> 7 #include<string.h> 8 #include<stdlib.h> 9 #include<vector> 10 #include<set> 11 #include<map> 12 #include<string> 13 #include<queue> 14 15 #define repA(p,q,i) for( int (i)=(p); (i)!=(q); ++(i) ) 16 #define repAE(p,q,i) for( int (i)=(p); (i)<=(q); ++(i) ) 17 #define repD(p,q,i) for( int (i)=(p); (i)!=(q); --(i) ) 18 #define repDE(p,q,i) for( int (i)=(p); (i)>=(q); --(i) ) 19 #define range 510 20 21 bool G[range][range]; 22 bool visit[range]; 23 int match[range]; 24 int n,k; 25 26 bool dfs(int s); 27 28 int main() 29 { 30 while( scanf("%d%d",&n,&k) != EOF ) 31 { 32 int a,b; 33 memset(G,false,sizeof(G) ); 34 while(k--) 35 { 36 scanf("%d%d",&a,&b); 37 G[a][b]=true; 38 } 39 40 repAE(1,n,i) match[i]=-1; 41 int used=0; 42 repAE(1,n,i) 43 { 44 memset(visit,false,sizeof(visit) ); 45 if(dfs(i) ) 46 ++used; 47 } 48 49 printf("%d\n",used); 50 } 51 return 0; 52 } 53 54 bool dfs(int s) 55 { 56 repAE(1,n,i) 57 { 58 if(G[s][i] && !visit[i]) 59 { 60 visit[i]=true; 61 if(match[i] == -1 || dfs( match[i] ) ) 62 { 63 match[i]=s; 64 return true; 65 } 66 } 67 } 68 return false; 69 }
To Be The Best Of Yourself