首页 > 代码库 > HDU1083_Courses_课程_C++
HDU1083_Courses_课程_C++
给你们人工翻译一下题目哈,刚好练一下英语
对于一个组中有 N 个学生和 P 种课程。每个学生能够参加0种,1种或者更多的课程。你的任务是找到一种可能的方案使恰好P个学生同时满足下列条件:
? 方案中的每一个学生选择的是不同的课程(前提是那个学生能够参加该课程)
? 方案中每个课程都被参加了
你的程序应该从读入多组测试数据。第一行文件内容是数据的组数。每一组数据后接下列形式:
P N
数量1 学生1 2 学生1 2 …… 学生1 数量1
数量2 学生2 2 学生2 2 …… 学生2 数量2
……
数量p 学生p 2 学生p 2 …… 学生p 数量p
每组数据中第一行两个整数由空格隔开:P(1≤P≤100)-课程数 和 N(1≤N≤300)-学生数。接下来P行用一个数列来描述每个课程。从课程1到课程P,每行用来描述该课程。每行课程开头的一个整数 i (0≤数量 i ≤N)是学生能够参加该课程的数量。接下来,一个空格之后,你将会得到 i 个学生能参加该课程,每两个连续的数由一个空格隔开。学生的编号是从1到N的整数。
在连续的两组数据间没有空行。输入的数据保证正确。
程序的结果是标准的输出。对于每一组数据如果有可能的方案打印单个的一行 “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
唔!翻译一道题累死人,比A它还慢,以后怎么打比赛啊……
我们来分析一下问题,其实就是P个课程和N个学生进行二分图匹配,可以有学生不上课,但是每个课程有且只有一个学生上
直接匈牙利算法(准备写这个算法,但是还没有码,贴个链接他写得蛮好的一看就懂,等我码完了再来换链接)
http://blog.csdn.net/dark_scope/article/details/8880547
下面是代码
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 9 const int N=301;10 int link[N],n,m;11 bool g[N][N],f[N];12 bool dfs(int x)13 {14 int i;15 for (i=1;i<=m;i++)16 if (f[i]&&g[x][i])17 {18 f[i]=0;19 if (!link[i]||dfs(link[i]))20 {21 link[i]=x;22 return 1;23 }24 }25 return 0;26 }27 int main()28 {29 int t,i,j,x;30 scanf("%d",&t);31 while (t>0)32 {33 t--;34 scanf("%d%d",&n,&m);35 for (i=1;i<=m;i++)36 {37 link[i]=0;38 for (j=1;j<=n;j++) g[j][i]=0;39 }40 for (i=1;i<=n;i++)41 {42 scanf("%d",&j);43 while (j>0)44 {45 j--;46 scanf("%d",&x);47 g[i][x]=1;48 }49 }50 for (i=1;i<=n;i++)51 {52 for (j=1;j<=m;j++) f[j]=1;53 if (!dfs(i)) break;54 }55 if (i>n) printf("YES\n");56 else printf("NO\n");57 }58 return 0;59 }
版权所有,转载请联系作者,违者必究
QQ:740929894
HDU1083_Courses_课程_C++