刚学OI 10^(-1919810) ms 的萌新求助dinic 63pts
查看原帖
刚学OI 10^(-1919810) ms 的萌新求助dinic 63pts
530180
KingPowers楼主2022/8/19 08:27

RT,WA on #6 #7 #10 and #11

#include<bits/stdc++.h>
#define int long long
#define inf 0x7fffffff
#define PII pair<int,int>
#define fx first
#define fy second
#define mk_p make_pair
#define Set(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=1e5+5;
struct edge{
	int nxt,to,val;
}e[maxn];
int n,m,s,t,cnt=1,head[maxn],dis[maxn],cur[maxn],ans;
inline int read(){
	int ans=0,flag=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')flag=-1;ch=getchar();}
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans*flag;
}
inline string reads(){
    string ss;char ch = getchar();
    while(ch=='\n'||ch=='\r'||ch==' ') ch=getchar();
    while(ch!='\n'&&ch!='\r'){if(ch!=' ') ss+=ch;ch=getchar();if(ch==EOF) break;}
    return ss;
}
inline void add(int u,int v,int w){
	e[++cnt].nxt=head[u];
	e[cnt].to=v,e[cnt].val=w;
	head[u]=cnt;
}
bool bfs(){
	memset(dis,0,(n+1)*sizeof(int));
	queue<int>q;
	q.push(s);
	dis[s]=1,cur[s]=head[s];
	while(q.size()){
		int u=q.front();q.pop();
		for(int i=cur[u];i;i=e[i].nxt){
			int to=e[i].to;
			if(e[i].val&&!dis[to]){
				dis[to]=dis[u]+1;
				cur[to]=head[to];
				q.push(to);
				if(to==t) return 1;
			}
		}
	}
	return 0;
}
int dinic(int u,int low){
	if(u==t) return low;
	int flow=0;
	for(int i=cur[u];i&&low;i=e[i].nxt){
		int to=e[i].to;
		if(e[i].val&&dis[to]==dis[u]+1){
			int res=dinic(to,min(low,e[i].val));
			e[i].val-=res,e[i^1].val+=res;
			low-=res,flow+=res;
		}
	}
	if(!flow) dis[u]=0;
	return flow;
}
signed main(){
	m=read(),n=read();
	s=n+1,t=n+2;
	int u,v;
	while(scanf("%lld%lld",&u,&v)&&u!=-1&&v!=-1) add(u,v,1e18),add(v,u,0);
	for(int i=1;i<=m;i++) add(s,i,1),add(i,s,0);
	for(int i=m+1;i<=n;i++) add(i,t,1),add(t,i,0);
	while(bfs()) ans+=dinic(s,1e18);
	if(!ans){
		printf("No Solution!");
		return 0;
	}
	printf("%lld\n",ans);
	for(int i=2;i<=cnt;i+=2)
		if(e[i].to!=s&&e[i^1].to!=s&&e[i].to!=t&&e[i^1].to!=t&&e[i^1].val)
			printf("%lld %lld\n",e[i^1].to,e[i].to);
	return 0;
}

2022/8/19 08:27
加载中...