选课(二分匹配)
Poj1649 COURSES
一共有N个学生跟P门课程一个学生可以任意选一 门或多门课,你需写一个程序,判断给定的输入是否可以满足以下条件。
1.每个学生选的都是不同的课(即不能有两个学生选同一门课)
2.即P门课都被成功选过
注意:是课程匹配的学生,学生没课上没事。
输入
第一行一个T代表T(T ≤ 10)组数据
对于每组测试样例,先输入两个整数P, N(P课程数 N学生数)。
接着p行:第i行代表第i门课程,首先一个数字k代表对课程i感兴趣的学生的个数,接下来是k个对这门课感兴趣的同学的编号。0 < P ≤ 500 0 < n ≤ 500。最大边数不超过1000.
输出
若能满足上述要求输出YES否则输出NO。
样例输入
2
3 3
3 1 2 3
2 1 2
1 1
3 3
2 1 3
2 1 3
1 1
样例输出
YES
NO
//二分匹配(完备匹配)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 5;
const int maxm = 500 + 5;
int un,vn;
int g[maxn][maxn];
int linker[maxn];
bool used[maxm];
bool dfs(int u){
for(int v=1;v<=vn;v++){
if(g[u][v]&&!used[v]){
used[v]=true;
if(linker[v]==-1||dfs(linker[v])){
linker[v]=u;
return true;
}
}
}
return false;
}
int hungary(){
int res = 0;
memset(linker,-1,sizeof linker);
for(int u=1;u<=un;u++){
memset(used,false,sizeof used);
if(dfs(u)) res++;
}
return res;
}
int main(){
int t,k,l;
cin>>t;
while(t--){
memset(g,0,sizeof g);
cin>>vn>>un;
for(int i=1;i<=vn;i++){
cin>>k;
for(int j=1;j<

博客介绍了如何利用图论中的二分图匹配解决选课问题,通过最小点覆盖解决守卫城镇的士兵部署问题,以及运用最大权匹配解决暖暖与梅拉的搭配比赛策略。通过实例解析了这三个概念并提供了样例输入与输出。
最低0.47元/天 解锁文章
13万+

被折叠的 条评论
为什么被折叠?



