标签:algorithm acm poj 二分图 匈牙利算法
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 18550 | Accepted: 7310 |
Description
Input
Output
Sample Input
2 3 3 3 1 2 3 2 1 2 1 1 3 3 2 1 3 2 1 3 1 1
Sample Output
YES NO
题意:P门课程,N个学生,问能否从中选出P个学生,使每个学生上不同的课,且每个课程有一个学生。
分析:二分图问题参考该神牛的blog:http://blog.csdn.net/hackbuteer1/article/details/7398008
题目链接:http://poj.org/problem?id=1469
代码清单:
#include<map>
#include<queue>
#include<cmath>
#include<stack>
#include<ctime>
#include<cctype>
#include<string>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxv = 300 + 5;
int T,P,N,M,Q,ans;
int match[maxv];
bool vis[maxv];
bool graph[maxv][maxv];
bool dfs(int u){ //匈牙利算法
for(int v=1;v<=N;v++){
if(!vis[v]&&graph[u][v]){
vis[v]=true;
if(match[v]==-1 || dfs(match[v])){
match[v]=u;
return true;
}
}
}
return false;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&P,&N);
memset(match,-1,sizeof(match));
memset(graph,false,sizeof(graph));
for(int i=1;i<=P;i++){
scanf("%d",&M);
while(M--){
scanf("%d",&Q);
graph[i][Q]=true;
}
}
ans=0;
for(int i=1;i<=P;i++){
memset(vis,false,sizeof(vis));
if(dfs(i)) ans++;
}
if(ans==P) printf("YES\n");
else printf("NO\n");
}return 0;
}
标签:algorithm acm poj 二分图 匈牙利算法
原文地址:http://blog.csdn.net/jhgkjhg_ugtdk77/article/details/45336103