题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1083
#include <stdio.h>
#include <stdlib.h>
#define bool char
#define true 1
#define false 0
#include <string.h>
int link[105][305];
int vis[305];
int stu[305];
int n,p;
bool find(int num) {
int i;
for(i=1; i<=n; i++) {
if(link[num][i]&&!vis[i]) {
vis[i]=1;
if(stu[i]==0||find(stu[i])) {
stu[i]=num;
return true;
}
}
}
return false;
}
int main() {
int all;
int t,i,m,a;
scanf("%d",&t);
while(t--) {
memset(link,0,sizeof(link));
memset(stu,0,sizeof(stu));
all=0;
scanf("%d%d",&p,&n);
for(i=1; i<=p; i++) {
scanf("%d",&m);//m是参观的学生个数
while(m--) {
scanf("%d",&a);
link[i][a]=1;//i是课程编号,a是学生编号
}
}
for(i=1; i<=p; i++) {
memset(vis,0,sizeof(vis));
if(find(i)) {
all+=1;
}
}
if(all==p) {
printf("YES\n");
} else {
printf("NO\n");
}
}
return 0;
}
本文介绍了解决HDU在线评测平台上的1083题的方法,该题涉及课程选修逻辑,通过使用邻接矩阵、深度优先搜索等算法来判断学生是否能完成所有课程的选修。详细步骤包括输入数据处理、构建邻接矩阵、进行深度优先搜索判断,最后输出结果。

535

被折叠的 条评论
为什么被折叠?



