POJ-1469 COURSES---二分图最大匹配--匈牙利算法
题目链接:
https://vjudge.net/problem/POJ-1469
题目大意:
给你p门课程和n个学生,一个学生可以选0门,1门,或者多门课程,现在要求一个由p个学生组成的集合,满足下列2个条件:
1.每个学生选择一个不同的课程
2.每个课程都有不同的代表
如果满足,就输出YES
解题思路:
邻接矩阵map[i][j]表示j号学生喜欢i号课程,然后对课程进行寻找匹配,匹配成功则标记学生,之后统计匹配数目即可。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #include<vector> 6 #include<queue> 7 using namespace std; 8 typedef pair<int, int> Pair ; 9 typedef long long ll; 10 const int INF = 0x3f3f3f3f; 11 const int maxn = 300 + 10; 12 int T, n, m, cases; 13 vector<int>G[maxn]; 14 int cx[maxn], cy[maxn]; 15 bool vis[maxn]; 16 bool dfs(int u) 17 { 18 for(int i = 0; i < G[u].size(); i++) 19 { 20 int v = G[u][i]; 21 if(!vis[v]) 22 { 23 vis[v] =1;//加入增广路 24 if(cy[v] == -1 || dfs(cy[v])) 25 { 26 cx[u] = v; 27 cy[v] = u; 28 return 1; 29 } 30 } 31 } 32 return 0; 33 } 34 int maxmatch() 35 { 36 int ans = 0; 37 memset(cx, -1, sizeof(cx)); 38 memset(cy, -1, sizeof(cy)); 39 for(int i = 1; i <= n; i++) 40 { 41 if(cx[i] == -1) 42 { 43 memset(vis, 0, sizeof(vis)); 44 ans += dfs(i); 45 } 46 } 47 return ans; 48 } 49 int main() 50 { 51 cin >> T; 52 while(T--) 53 { 54 scanf("%d%d", &n, &m); 55 int x, t; 56 for(int i = 1; i <= n; i++) 57 { 58 scanf("%d", &t); 59 G[i].clear(); 60 for(int j = 0; j < t; j++) 61 { 62 scanf("%d", &x); 63 G[i].push_back(x); 64 } 65 } 66 if(maxmatch() == n)cout<<"YES"<<endl; 67 else cout<<"NO"<<endl; 68 } 69 return 0; 70 }
越努力,越幸运