题面

大秦为你打开题目传送门

题目描述

一共有 $N$ 个学生(从 $1$ 到 $N$ 编号)跟 $P$ 门课程(从 $1$ 到 $P$ 编号),每位学生有自己感兴趣的课程,只能选自己感兴趣的课当课代表,

现在要求每个学生至多担任一门课代表,且一门课代表至多只能由一个学生担任,问是否每一门课能配到一个课代表。

思路

这不用想了把,,,,一眼二分图最大匹配模板题,,,,

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<bits/stdc++.h>
using namespace std;

int p, n;
int mp[110][310];

int vis[310];
int chk[310];

void Input() {
scanf("%d%d", &p, &n);
int m, x;
for(int i = 1; i <= p; i++) {
scanf("%d", &m);
for(int j = 1; j <= m; j++) {
scanf("%d", &x);
mp[i][x] = 1;
}
}
}

int Dfs(int u) {
for(int i = 1; i <= n; i++) {
if(mp[u][i] && !chk[i]) {
chk[i] = 1;
if(!vis[i] || Dfs(vis[i])) {
vis[i] = u;
return 1;
}
}
}
return 0;
}

void Work() {
int ans = 0;
memset(vis, 0, sizeof(vis));
for(int i = 1; i <= p; i++) {
memset(chk, 0, sizeof(chk));
ans += Dfs(i);
}
if(ans == p) printf("YES\n");
else printf("NO\n");
}

int main() {
Input();
Work();
return 0;
}