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 }

猜你喜欢

转载自www.cnblogs.com/fzl194/p/8835482.html