【玄关】Dinic求条
查看原帖
【玄关】Dinic求条
1038710
AutumnQ楼主2024/3/24 15:53

RT

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int m,n,s,t;
int level[205];
int used[205];
int u,v,w;
struct Dinic{
    int c;
    int f;
}edge[205][205];
bool dinic_bfs(){
    queue<int> q;
    memset(level,0,sizeof(level));
    q.push(1);
    level[1]=1;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int v=1;v<=n;v++){
            if(!level[v] && edge[u][v].c>edge[u][v].f){
                level[v]=level[u]+1;
                q.push(v);
            }
        }
    }
    return level[n]!=0; 
}
int dinic_dfs(int u,int cp){  
    int tmp=cp;
    if(u==n)return cp;
    for(int v=1;v<=n && tmp;v++){
        if(level[u]+1==level[v]){
            if(edge[u][v].c>edge[u][v].f){
                int t=dinic_dfs(v,min(tmp,edge[u][v].c-edge[u][v].f));
                edge[u][v].f+=t;
                edge[v][u].f-=t;
                tmp-=t;
            }
        }
    }
    return cp-tmp;
}
int dinic(){
    int sum=0,tf=0;
    while(dinic_bfs()){
        while(tf=dinic_dfs(1,INF))sum+=tf;
    }
    return sum;
}
int main(){
	cin>>n>>m;
	int u,v;
	cin>>u>>v;
	for(int i=1;i<=n;i++){
		edge[1][i+1].c++;
		edge[i+1][1].c++;
	}
	for(int i=n+1;i<=m;i++){
		edge[i+1][m+2].c++;
		edge[m+2][i+1].c++;
	}
	n=m+2;
    while(u!=-1 && v!=-1){
        edge[u+1][v+1].c++;
        edge[v+1][u+1].c++;
        cin>>u>>v;
    }
    int ans=dinic();
    printf("%d\n",ans);
    for(int i=2;i<=n+1;i++){
    	for(int j=1;j<=m+1;j++){
    		if(edge[i][j].f && i<j && !used[i] && !used[j]){
    			used[i]=used[j]=true;
				cout<<i-1<<' '<<j-1<<endl;
			}
    	}
    }
}
2024/3/24 15:53
加载中...