简单最大匹配数问题
#include<bits/stdc++.h> using namespace std; #define MAXI 1005 int mp[MAXI][MAXI]; int used[MAXI]; int vis[MAXI]; int n,m,p; bool dfs(int x) { for(int j=1;j<=p;j++) { if(mp[x][j]&&!used[j]) { used[j]=1; if(!vis[j]||dfs(vis[j])) { vis[j]=x; return true; } } } return false; } int find1(void) { int ans=0; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { memset(used,0,sizeof(used)); if(dfs(i))ans++; } return ans; } int main() { int cas; scanf("%d",&cas); while(cas--) { memset(mp,0,sizeof(mp)); scanf("%d%d",&p,&n); for(int i=1;i<=p;i++) { int k;scanf("%d",&k); while(k--) { int x;scanf("%d",&x); mp[x][i]=1; } } int ans=find1(); if(ans==p) printf("YES\n"); else printf("NO\n"); } }
原文:https://www.cnblogs.com/bxd123/p/10370406.html