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

HDU ACM 1083 Courses 二分图最大匹配

时间:2015-06-04 13:49:58      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:c   c++   acm   算法   编程   

题意:p门课,每门课有若干学生,要为每门课分配一名课代表,每个学生只能担任一门课的课代表,若每个课都能找到课代表,则输出"YES",否则"NO"。
分析:二分图的最大匹配,对课程、学生关系建立一个图,进行二分图最大匹配,当最大匹配数==课程数时说明能够满足要求,否则不能。

#include<iostream>
using namespace std;

#define N 303
bool cs[N][N];  //cs[i][j]表示学生j是否选i这个课程
int link[N];    //link[i]=j表示j课程的课代表是i
bool ha[N];   //代表学生是否已当选某个课代表

int p,n;

bool Find(int x)  //为课程x分配课代表
{
	int i;

	for(i=1;i<=n;i++)
		if(!ha[i] && cs[x][i]==1) //若i学生还没有担任课代表并且选了x课程
		{
			ha[i]=true;
			if(!link[i]||Find(link[i]))  //i还未担任过课代表或者其担任的课代表可以找到别人担任
			{
				link[i]=x;
				return true;
			}
		}
	return false;
}

int main()      
{
	int i,T,x,sum,m;

	cin>>T;
	while(T--)
	{
		cin>>p>>n;
		memset(cs,false,sizeof(cs));
		for(i=1;i<=p;i++)
		{
			cin>>m;
			while(m--)
				cs[i][cin>>x,x]=true;
		}
		sum=0;
		memset(link,false,sizeof(link));
		for(i=1;i<=p;i++)    //为每个课程分配课代表
		{
			memset(ha,false,sizeof(ha)); //每次选择课代表时,每个学生都要从头考虑,直到找到合适的课代表为止
			if(Find(i)) sum++;
		}
		if(sum==p) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
    return 0;      
}


HDU ACM 1083 Courses 二分图最大匹配

标签:c   c++   acm   算法   编程   

原文地址:http://blog.csdn.net/a809146548/article/details/46359633

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