水题
/* n门课,每门课有一个时间t 要求最大的n->t的匹配 */ #include<iostream> #include<cstring> #include<cstdio> using namespace std; #define maxn 1005 int mp[maxn][maxn],match[maxn],vis[maxn],n,m; int dfs(int x){ for(int i=1;i<=m;i++) if(!vis[i] && mp[x][i]){ vis[i]=1; if(match[i]==-1 || dfs(match[i])){ match[i]=x;return 1; } } return 0; } int sum(){ int res=0; for(int i=1;i<=n;i++){ memset(vis,0,sizeof vis); if(dfs(i))res++; } return res; } void init(){ memset(match,-1,sizeof match); memset(mp,0,sizeof mp); } int main(){ m=1000; while(cin>>n){ init(); for(int i=1;i<=n;i++){ int k,a,b; scanf("%d",&k); while(k--){ scanf("%d%d",&a,&b); mp[i][b*10+a]=1; } } cout<<sum()<<endl; } }
原文:https://www.cnblogs.com/zsben991126/p/10887253.html