HDU2063过上车【匈牙利】
大意:同学们去坐过山车,但是想要去做过山车必须是一个男同学一个女同学一起坐,
现在告诉你每个女同学想要跟那些人一起坐,问最多能有多少对同学能够坐过山车
男女同学人数都是<=500
思路:
将女同学跟其喜欢的男同学连一条边,然后求二分图的最大匹配即可。
也可以用最大流来做,将源点与女同学之间建立一个容量为1的边,将女同学与其喜欢的男同学都建立一条容量为1的边,最后将男同学与汇点建立一条容量为1的边jike,求出最大刘即可。
匈牙利算法,人数很少直接用的邻接矩阵存储的
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 const int maxn = 505; 7 bool G[maxn][maxn]; 8 int Left[maxn]; 9 bool vis[maxn]; 10 int n, m; 11 12 bool Find(int u) { 13 for(int i = 1; i <= m; i++) { 14 if(G[u][i] && !vis[i]) { 15 vis[i] = true; 16 if(Left[i] == -1 || Find(Left[i])) { 17 Left[i] = u; 18 return true; 19 } 20 } 21 } 22 return false; 23 } 24 25 void solve() { 26 int num = 0; 27 memset(Left, -1, sizeof(Left)); 28 for(int i = 1; i <= n; i++) { 29 memset(vis, 0, sizeof(vis)); 30 if(Find(i)) num++; 31 } 32 printf("%d\n",num); 33 } 34 35 int main() { 36 int k; 37 int u, v; 38 // freopen("a.txt","r",stdin); 39 while(scanf("%d",&k) && k) { 40 scanf("%d %d",&n, &m); 41 memset(G, false, sizeof(G)); 42 for(int i = 0; i < k; i++) { 43 scanf("%d %d",&u, &v); 44 G[u][v] = 1; 45 } 46 solve(); 47 } 48 return 0; 49 }