超級英雄[最大匹配]
阿新 • • 發佈:2018-12-02
第i輪向妙計建邊 , 然後跑最大匹配
發現第i個找不到的時候就可以break 然後輸出答案了
#include<bits/stdc++.h> #define N 1050 #define M 100050 using namespace std; int first[N],next[M],to[M],tot; int n,m,vis[N],match[N],cnt,ans[N]; void add(int x,int y){ next[++tot]=first[x],first[x]=tot,to[tot]=y; } bool find(int u){ for(int i=first[u];i;i=next[i]){ int t=to[i]; if(!vis[t]){ vis[t]=1; if(!match[t] || find(match[t])){ match[t]=u; return true; } } }return false; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int x,y; scanf("%d%d",&x,&y); ++x,++y; add(i,x) , add(i,y); } for(int i=1;i<=n;i++){ memset(vis,0,sizeof(vis)); if(!find(i)) break; cnt++; } for(int i=1;i<=n;i++) ans[match[i]]=i; printf("%d\n",cnt); for(int i=1;i<=cnt;i++) printf("%d\n",ans[i]-1); return 0; }