弱弱的我不会网络流,发现这道题二分图也能水过,直接匈牙利不比Dinic好写一些吗???
#include<bits/stdc++.h> using namespace std; int n,k,need[25],vis[1005],match[1005],ans; vector<int>a[25],c[25]; int dfs(int col){ //printf("%d\n",col); for(int i=0;i<a[col].size();i++) if(!vis[a[col][i]]){ int t=a[col][i]; vis[t]=1; if(!match[t]||dfs(match[t])){ match[t]=col; return 1; } } return 0; } int main(){ cin>>k>>n; for(int i=1;i<=k;i++) scanf("%d",&need[i]); for(int i=1;i<=n;i++){ int p,q; scanf("%d",&p); for(int j=1;j<=p;j++){ scanf("%d",&q); a[q].push_back(i); } } for(int i=1;i<=k;i++){ for(int j=1;j<=need[i];j++){ memset(vis,0,sizeof(vis)); ans+=dfs(i); } } for(int i=1;i<=k;i++) ans-=need[i]; if(ans!=0){ puts("No Solution!"); return 0; } for(int i=1;i<=n;i++) c[match[i]].push_back(i); for(int i=1;i<=k;i++){ printf("%d: ",i); for(int j=0;j<c[i].size();j++) printf("%d ",c[i][j]); puts(""); } return 0; }
深深地感到自己的弱小。