首页 > 代码库 > hoj1083解题报告

hoj1083解题报告

   不知怎么zoj网站打不开,于是到杭电上选了道题做,一道图论题.题目大致意思就是有p个课程n个学生,如果每个课程都有一个学生选择,且一个学生只能选一个,则输出YES,否则输出NO.学生可能有多个选择,但只能选一个.典型的匈牙利二分匹配,如果是完全2分匹配则满足条件.要注意的是学生id是从1开始的.

代码如下:


#include <set>
#include <map>
#include <queue>
#include <stack>
#include <math.h>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <algorithm>
#include <functional>
using namespace std;
int vis[305][305];
int ended[305];
int match[305];
int find(int i,int n){
for(int j = 1;j <= n;j++){
if( vis[i][j] && !ended[j]){
ended[j] = 1;
if(match[j] == -1 || find(match[j],n)){
match[j] = i;
return 1;
}
}
}
return 0;
}
int main(){
int t;
while(scanf("%d",&t)!=EOF){
while(t--){
memset(vis,0,sizeof(vis));
memset(match,-1,sizeof(match));
memset(ended,0,sizeof(ended));
int p,n,sum = 0,id;
scanf("%d%d",&p,&n);
for(int i = 0;i < p;i++){
scanf("%d",&sum);
for(int j = 0;j < sum;j++){
scanf("%d",&id);
vis[i][id] = 1;
}
}
int res = 0;
for(int i = 0;i < p;i++){
memset(ended,0,sizeof(ended));
if(find(i,n))
res++;
}
if(res == p)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}

hoj1083解题报告