1 条题解

  • 1
    @ 2022-8-25 9:21:25
    #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
    上传者