码迷,mamicode.com
首页 > 其他好文 > 详细

hoj1083解题报告

时间:2014-11-01 13:16:56      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:io   os   for   sp   on   cti   代码   bs   amp   

   不知怎么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解题报告

标签:io   os   for   sp   on   cti   代码   bs   amp   

原文地址:http://www.cnblogs.com/wanghaoyue/p/4066975.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!