标签:
题目大意:
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; #define maxn 505 bool G[maxn][maxn];///图存储 bool vis[maxn];///标记点是否被遍历过 int P[maxn];///表示第i个学生选的是第P[i]门课程 int n, m;///n门课程 m个学生 bool Find(int u) { for(int i=1; i<=m; i++) { if(G[u][i] && !vis[i])///判断第i个学生是否喜欢第U门课, 并且判断第i个学生是否被遍历过 { vis[i] = true;///标记第i个学生被遍历过了 if( !P[i] || Find(P[i]) )/**判断第i个学生是否选过课了,如果选过了就看看能否更改这个学生所选的课程,让这个学生选u这门课*/ {///如果u这门课 i是可以选的,退出函数完成筛选,否则继续为u进行挑选学生,直到没有 P[i] = u; return true; } } } return false; } int main() { int T, v, j, i, k; scanf("%d", &T); while(T--) { memset(G, false, sizeof(G)); memset(P, 0, sizeof(P)); scanf("%d %d",&n, &m); for(i=1; i<=n; i++) { scanf("%d", &k); while(k --) { scanf("%d", &v); G[i][v] = true; } } for(j=1; j<=n; j++) {/**我们每一次进行搜索的时候所有的点都要置为未遍历,因为我们每一次选课都要重新分配课程*/ memset(vis, false, sizeof(vis)); /**判断 j 课程是否找到了自己的学生**/ if( !Find(j) ) break; } if( j == n + 1) puts("YES"); else puts("NO"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/chenchengxun/p/4718556.html