1 条题解
-
0
#include<bits/stdc++.h> using namespace std; const int inf=1e9; int n,m,s,t; struct node{ int v,w,rev; };vector<node>q[200005]; void add(int u,int v,int w){ q[u].emplace_back(node{v,w,(int)q[v].size()}); q[v].emplace_back(node{u,0,(int)q[u].size()-1}); } int dis[200005],now[200005]; bool bfs(int s){ for(int i=1;i<=n*2+2;i++)dis[i]=0; queue<int>p;dis[s]=1,now[s]=0,p.push(s); while(!p.empty()){ int x=p.front();p.pop(); for(auto [v,w,rev]:q[x]){ if(w&&!dis[v]){ dis[v]=dis[x]+1,now[v]=0,p.push(v); if(v==t)return 1; } } }return 0; } int dfs(int x,int flow){ if(x==t)return flow; int res=flow; for(int &i=now[x];i<(int)q[x].size();i++){ int v=q[x][i].v,&w=q[x][i].w,rev=q[x][i].rev; if(w&&dis[v]==dis[x]+1){ int k=dfs(v,min(w,res)); if(!k)dis[v]=0; res-=k,w-=k,q[v][rev].w+=k; } if(!res)break; } return flow-res; } int dinic(){ int ans=0; while(bfs(s))ans+=dfs(s,inf); return ans; } int fa[200005],nxt[200005]; int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]); } void merge(int x,int y){ x=find(x),y=find(y); if(x==y)return; fa[y]=x; } signed main(){ ios::sync_with_stdio(0);cin.tie(0),cout.tie(0); cin>>n>>m;s=n*2+1,t=n*2+2; for(int i=1;i<=n;i++)add(s,i,1),add(i+n,t,1); for(int i=1;i<=m;i++){ int u,v;cin>>u>>v; add(u,v+n,1); } int ans=n-dinic(); for(int i=1;i<=n;i++){ for(auto [v,w,rev]:q[i])if(v>n&&v!=s&&!w)fa[v-n]=i,nxt[i]=v-n;//cout<<i<<"->"<<v-n<<endl; } //for(int i=1;i<=n;i++)cout<<find(i)<<endl; for(int i=1;i<=n;i++){ if(!fa[i]){ for(int j=i;j;j=nxt[j])cout<<j<<" "; cout<<endl; } } cout<<ans<<endl; }
- 1
信息
- ID
- 968
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 16
- 已通过
- 5
- 上传者