最大二分匹配
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<map> #include<iostream> #include<math.h> #include <queue> #include<algorithm> using namespace std; int vis[305];//记录y中节点是否使用 int ans[305];记录当前与y节点相连的x的节点 int mat[105][305];//记录连接x和y的边,如果i和j之间有边则为1,否则为0 int n,m; int dfs(int x) { for(int i=1;i<=m;i++) { if(vis[i]==0&&mat[x][i]) { vis[i]=1; if(ans[i]==0||dfs(ans[i])) { ans[i]=x; return 1; } } } return 0; } int match() { int sum=0; for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) sum++; } return sum; } int main() { int t; scanf("%d",&t); while(t--) { int k; memset(mat,0,sizeof(mat)); memset(ans,0,sizeof(ans)); scanf("%d%d",&n,&m); int i,j,a; for(i=1;i<=n;i++) { scanf("%d",&k); while(k--) { scanf("%d",&a); mat[i][a]=1; } } if(match()==n) printf("YES\n"); else printf("NO\n"); } return 0; }
题目是说有几门课程和几个学生,让你求的学生和课程之间的最大匹配数是否和所给的课程数目相等。
如果相等输出“YES” 否则,输出“NO“