http://162.105.81.212/JudgeOnline/problem?id=1469 #include <iostream> #include <algorithm> using namespace std; #define MAX 305 //二部图一侧顶点的最大个数 int n,m,match[MAX]; //二分图的两个集合分别含有n和m个元素。 bool visit[MAX],map[MAX][MAX]; //map存储邻接矩阵。 bool DFS(int k) { int t; for(int i=0;i<m;i++) { if(map[k][i]&&!visit[i]) { visit[i]=true; t=match[i]; match[i]=k; if(t==-1||DFS(t)) return true; match[i]=t; } } return false; } int Max_match() { int ans=0; memset(match,-1,m*sizeof(match[0])); for(int i=0;i<n;i++) { memset(visit,0,m*sizeof(visit[0])); if(DFS(i)) ans++; } return ans; } int main() { int t,num,stu; scanf("%d",&t); while(t--) { memset(map,0,sizeof(map)); scanf("%d%d",&n,&m); for(int i=0;i<n;i++) { scanf("%d",&num); for(int j=0;j<num;j++) { scanf("%d",&stu); map[i][stu-1]=1; } } if(n==Max_match()) printf("YES/n"); else printf("NO/n"); } return 0; }