题目链接: hdu 1083
题目大意: 给你N种课程和M个学生,每个学生有自己喜欢的课程
若每个课程都能有一个学生代表输出YES,否则NO
解题思路: 把课程作为X集合,学生作为Y集合
匈牙利求他们之间的最大匹配数
若最大匹配数等于课程数(不可能大于的),则满足题意
每种课程都有学生作为代表
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 505 int edge[105][MAX]; int P,n,cx[105],cy[MAX],visit[MAX]; int DFS(int u) //匈牙利DFS增广 { int i; for(i=1;i<=n;i++) { if(edge[u][i]&&!visit[i]) { visit[i]=1; if( !cy[i] || DFS(cy[i]) ) { cx[u]=i; cy[i]=u; return 1; } } } return 0; } int main() { int t,i,j,a,b,sum; scanf("%d",&t); while(t--) { scanf("%d%d",&P,&n); sum=0; memset(cx,0,sizeof(cx)); memset(cy,0,sizeof(cy)); memset(edge,0,sizeof(edge)); for(i=1;i<=P;i++) { scanf("%d",&a); for(j=1;j<=a;j++) { scanf("%d",&b); edge[i][b]=1; //单向边 } } for(i=1;i<=P;i++) { if(!cx[i]) { memset(visit,0,sizeof(visit)); sum+=DFS(i); //增广轨 } } if(sum==P) //若最大匹配数等于课程数输出YES printf("YES\n"); else printf("NO\n"); } return 0; }