1 条题解

  • 0
    @ 2026-2-7 19:12:49
    #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

    「网络流 24 题」最小路径覆盖

    信息

    ID
    968
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    16
    已通过
    5
    上传者