Dinic0pts求调
查看原帖
Dinic0pts求调
853503
Ayk71200楼主2024/4/28 11:11

记录

#include<bits/stdc++.h>
using namespace std;
int cnt=1,ans=0,n,m,a,b,s,t,head[205],d[205],now[205];
struct edge{
	int u,v,next,w;
}e[20205];
void add(int u,int v,int w){
	e[++cnt].v=v;	e[cnt].u=u; e[cnt].w=w;	e[cnt].next=head[u];	head[u]=cnt;
	e[++cnt].v=u;	e[cnt].u=v; e[cnt].w=0;	e[cnt].next=head[v];	head[v]=cnt;	
}
bool bfs(){
	memset(d,0,sizeof(d));	
	memset(now,0,sizeof(now));
	now[s]=head[s];
	d[s]=1;
	queue<int> q;
	q.push(s);
	while(!q.empty()){
	int x=q.front();
	q.pop();
	for(int i=head[x];i;i=e[i].next){
		if(e[i].w>0&&!d[e[i].v]){
		d[e[i].v]=d[x]+1;
		now[e[i].v]=head[e[i].v];
		q.push(e[i].v);	
		}
	}	
	}
	if(d[t]) return 1;
	return 0;
}
int dfs(int x,int w){
if(x==t) return w;
	int k,res=0;
for(int i=now[x];i;i=e[i].next){
	now[x]=i;
	if((d[e[i].v]==d[x]+1)&&(e[i].w>0)){
	k=dfs(e[i].v,min(w,e[i].w));
	if(!k) continue;
	res+=k;
	w-=k;
	e[i].w-=k;
	e[i^1].w+=k;
	}
}
return res;
}

int main(){
scanf("%d%d",&m,&n);
s=n+1,t=n+2;
while(scanf("%d%d",&a,&b)&&(a!=-1&&b!=-1))	add(a,b,1);
for(int i=1;i<=m;i++) add(s,i,1);
for(int i=m+1;i<=n;i++) add(i,t,1);	
if(bfs()) 	{ans+=dfs(s,0x3f3f3f);}
printf("%d\n",ans);
for(int i=2;i<=cnt;i+=2){
	if((e[i].u!=s&&e[i].v!=s)&&(e[i].u!=t&&e[i].v!=t))
	if(e[i].w==0) printf("%d %d\n",e[i].u,e[i].v);
}
return 0;	
}
2024/4/28 11:11
加载中...