Poj--1274(二分图最大匹配)
2014-11-02 17:34:20
思路:二分图最大匹配启蒙题~这里要特别推荐一篇神级博客:http://blog.csdn.net/dark_scope/article/details/8880547,讲的很有趣,生动形象,不拘于论文格式,图文并茂!让人记忆深刻。
1 /************************************************************************* 2 > File Name: 1274.cpp 3 > Author: Nature 4 > Mail: 564374850@qq.com 5 > Created Time: Sun 02 Nov 2014 05:15:34 PM CST 6 ************************************************************************/ 7 8 #include <cstdio> 9 #include <cstring> 10 #include <cstdlib> 11 #include <cmath> 12 #include <vector> 13 #include <map> 14 #include <set> 15 #include <stack> 16 #include <queue> 17 #include <iostream> 18 #include <algorithm> 19 using namespace std; 20 #define lp (p << 1) 21 #define rp (p << 1|1) 22 #define getmid(l,r) (l + (r - l) / 2) 23 #define MP(a,b) make_pair(a,b) 24 typedef long long ll; 25 const int INF = 1 << 30; 26 const int maxn = 210; 27 28 int N,M; 29 int first[maxn],next[maxn * maxn],ver[maxn * maxn],ecnt; 30 int used[maxn],mat[maxn]; 31 int g[maxn][maxn]; 32 33 void Init(){ 34 memset(first,-1,sizeof(first)); 35 memset(mat,0,sizeof(mat)); 36 memset(g,0,sizeof(g)); 37 ecnt = 0; 38 } 39 40 void Add_edge(int u,int v){ 41 next[++ecnt] = first[u]; 42 ver[ecnt] = v; 43 first[u] = ecnt; 44 } 45 46 bool find(int p){ 47 for(int i = first[p]; i != -1; i = next[i]){ 48 int v = ver[i]; 49 if(used[v] == 0){ 50 used[v] = 1; 51 if(mat[v] == 0 || find(mat[v])){ 52 mat[v] = p; 53 return true; 54 } 55 } 56 } 57 return false; 58 } 59 60 int Hungary(){ 61 int res = 0; 62 for(int i = 1; i <= N; ++i){ 63 memset(used,0,sizeof(used)); 64 if(find(i)) ++res; 65 } 66 return res; 67 } 68 69 int main(){ 70 int a,b; 71 while(scanf("%d%d",&N,&M) != EOF){ 72 Init(); 73 for(int i = 1;i <= N; ++i){ 74 scanf("%d",&a); 75 while(a--){ 76 scanf("%d",&b); 77 Add_edge(i,b); 78 } 79 } 80 printf("%d\n",Hungary()); 81 } 82 return 0; 83 }