POJ 1469 ZOJ 1140 Courses 二分图匹配
继续匈牙利二分匹配,其实我都不知道怎样写匈牙利算法,只是记住了可以这样写,悲哀啊
唉````
裸的二分匹配,贴代码:
View Code
1 #include <cstdio> 2 #include <cstring> 3 #define MAXC 105 4 #define MAXS 305 5 bool g[MAXC][MAXS]; 6 bool used[MAXS]; 7 int p,n; 8 int xx[MAXC],yy[MAXS]; 9 void init() 10 { 11 int i,j; 12 scanf("%d%d",&p,&n); 13 memset(g,0,sizeof(g)); 14 for(i=0; i<p; ++i) 15 { 16 int num,st; 17 scanf("%d",&num); 18 for(j=0; j<num; ++j) 19 { 20 scanf("%d",&st); 21 g[i][st]= 1; 22 } 23 } 24 } 25 bool path(int u) 26 { 27 int v; 28 for(v=1; v<=n; ++v) 29 { 30 if(g[u][v] && !used[v]) 31 { 32 used[v] = 1; 33 if(yy[v] == -1 || path(yy[v])) 34 { 35 xx[u] = v; 36 yy[v] = u; 37 return 1; 38 } 39 } 40 } 41 return 0; 42 } 43 void maxMatch() 44 { 45 int i; 46 memset(xx,0xff,sizeof(xx)); 47 memset(yy,0xff,sizeof(yy)); 48 int ans = 0; 49 for(i=0; i<p; ++i) 50 { 51 if(xx[i] == -1) 52 { 53 memset(used,0,sizeof(used)); 54 if(path(i)) 55 ++ans; 56 } 57 } 58 if(ans == p) printf("YES\n"); 59 else printf("NO\n"); 60 } 61 int main() 62 { 63 // freopen("in.cpp","r",stdin); 64 int T; 65 scanf("%d",&T); 66 while(T--) 67 { 68 init(); 69 maxMatch(); 70 } 71 return 0; 72 }