1 条题解
-
1
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+15; const int maxm=2e6+5; const int inf=0x3f3f3f3f; int n,m,S,T,num,s,t,x,y,cur[maxn],hd[maxn],cnt,dis[maxn],deg[maxn],tot; int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-')f=-1; ch=getchar(); } while(isdigit(ch)){ x=x*10+ch-48; ch=getchar(); } return x*f; } struct Edge{ int nxt,to,val; }edge[maxm]; void add(int u,int v,int w){ edge[++cnt].nxt=hd[u]; edge[cnt].to=v; edge[cnt].val=w; hd[u]=cnt; return ; } void make(int u,int v,int down,int up){ deg[u]-=down; deg[v]+=down; add(u,v,up-down); add(v,u,0); return ; } bool bfs(){ memset(dis,0,sizeof dis); queue<int>q; q.push(S); cur[S]=hd[S]; dis[S]=1; while(!q.empty()){ int u=q.front(); q.pop(); for(int i=hd[u];i;i=edge[i].nxt){ int v=edge[i].to; if((!dis[v])&&edge[i].val){ dis[v]=dis[u]+1; cur[v]=hd[v]; if(v==T)return true; q.push(v); } } } return false; } int dfs(int u,int limit){ if(u==T)return limit; int flow=0; for(int i=cur[u];i&&flow<limit;i=edge[i].nxt){ int v=edge[i].to; cur[u]=i; if(dis[v]==dis[u]+1&&edge[i].val){ int ww=dfs(v,min(edge[i].val,limit-flow)); if(!ww)dis[v]=0; edge[i].val-=ww; edge[i^1].val+=ww; flow+=ww; } } return flow; } int dinic(){ int r=0,flow=0; while(bfs()){ while(flow=dfs(S,inf)){ r+=flow; } } return r; } int main(){ n=read(); s=0; t=n+1; S=n+2; T=n+3; cnt=1; for(int i=1;i<=n-1;i++){ x=read()+1; y=read()+1; make(y,x,1,inf); } for(int i=1;i<=n;i++){ make(s,i,0,inf); make(i,t,0,inf); } for(int i=0;i<=n+1;i++){ if(deg[i]>0){ make(S,i,0,deg[i]); } else make(i,T,deg[i],0); } make(t,s,0,inf); dinic(); int ans=edge[cnt].val; S=t; T=s; edge[cnt].val=edge[cnt^1].val=0; cout<<ans-dinic(); return 0; }
- 1
信息
- ID
- 4185
- 时间
- 1000ms
- 内存
- 250MiB
- 难度
- 5
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者