请问危桥网络流为什么不判自环会WA呀?
查看原帖
请问危桥网络流为什么不判自环会WA呀?
976965
wangxinkuan楼主2023/11/2 20:55

这是判自环的:```cpp #include <bits/stdc++.h> using namespace std; #define int long long const int MAXN = 1e6+1e3; const int inf = 2e9; int n,as,at,acnt,bs,bt,bcnt; int s,t; char G[62][62]; struct Edge { int from; int to; int nxt; int val; }Edge_[MAXN<<1]; int totr=1,head[MAXN]; void Add_edge(int from,int to,int val) { totr++; Edge_[totr].nxt=head[from]; Edge_[totr].from=from; Edge_[totr].to=to; Edge_[totr].val=val; head[from]=totr; } int vis[MAXN],dis[MAXN],cur[MAXN]; bool bfs() { for(int i=0;i<=t;i++) vis[i]=dis[i]=0; queueq; q.push(s); vis[s]=1; cur[s]=head[s]; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i;i=Edge_[i].nxt) { int to=Edge_[i].to; if(!Edge_[i].val||vis[to]) continue; vis[to]=1; dis[to]=dis[u]+1; cur[to]=head[to]; q.push(to); } } return dis[t]; } int dfs(int x,int sum) { if(x==t) return sum; int res=0; for(int i=cur[x];i&∑i=Edge_[i].nxt) { int to=Edge_[i].to; cur[x]=i; if(!Edge_[i].val||dis[to]!=dis[x]+1) continue; int k=dfs(to,min(sum,Edge_[i].val)); if(!k) dis[to]=inf; sum-=k; res+=k; Edge_[i].val-=k; Edge_[i^1].val+=k; } return res; } int ans; void init() { ans=0; memset(head,0,sizeof head); memset(Edge_,0,sizeof Edge_); totr=1; } signed main() { // ios::sync_with_stdio(false); // cin.tie(nullptr),cout.tie(nullptr); while(scanf("%lld%lld%lld%lld%lld%lld%lld",&n,&as,&at,&acnt,&bs,&bt,&bcnt)!=EOF) { int f=0; init(); // cin>>n>>as>>at>>acnt>>bs>>bt>>bcnt; for(int i=0;i<n;i++) scanf("%s",G[i]); for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { if(G[i][j]=='N') { Add_edge(i,j,inf); Add_edge(j,i,inf); } else if(G[i][j]=='O') { Add_edge(i,j,1); Add_edge(j,i,1); } } } s=n,t=n+1; Add_edge(s,as,acnt); Add_edge(as,s,0); Add_edge(s,bs,bcnt); Add_edge(bs,s,0); Add_edge(at,t,acnt); Add_edge(t,at,0); Add_edge(bt,t,bcnt); Add_edge(t,bt,0); while(bfs()) ans+=dfs(s,inf); if(ans==acnt+bcnt) f++; if(!f) { puts("No"); continue; } // printf("f=%d\n",f); init(); for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { if(G[i][j]=='N') { Add_edge(i,j,inf); Add_edge(j,i,inf); } else if(G[i][j]=='O') { Add_edge(i,j,1); Add_edge(j,i,1); } } } swap(bs,bt); // s=n,t=n+1; Add_edge(s,as,acnt); Add_edge(as,s,0); Add_edge(s,bs,bcnt); Add_edge(bs,s,0); Add_edge(at,t,acnt); Add_edge(t,at,0); Add_edge(bt,t,bcnt); Add_edge(t,bt,0); while(bfs()) ans+=dfs(s,inf); if(ans==acnt+bcnt) f++; if(f==2) puts("Yes"); else puts("No"); // printf("f=%d\n",f); // s=as,t=at; // while(bfs()) ans+=dfs(s,inf); // if(ans>=acnt) f++; // s=bs,t=bt; // ans=0; // while(bfs()) ans+=dfs(s,inf); // if(ans>=bcnt) f++; // (f==2)?puts("Yes"):puts("No"); // f==2?cout<<"Yes\n":cout<<"No\n"; } return 0; } /* 4 0 1 1 2 3 1 XOXX OXOX XOXO XXOX 4 0 2 1 1 3 2 XNXO NNNX XXNN OXXO */

这是不判的:```cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 1e6+1e3;
const int inf = 2e9;
int n,as,at,acnt,bs,bt,bcnt;
int s,t;
char G[62][62];
struct Edge
{
	int from;
	int to;
	int nxt;
	int val;
}Edge_[MAXN<<1];
int totr=1,head[MAXN];
void Add_edge(int from,int to,int val)
{
	totr++;
	Edge_[totr].nxt=head[from];
	Edge_[totr].from=from;
	Edge_[totr].to=to;
	Edge_[totr].val=val;
	head[from]=totr;
}
int vis[MAXN],dis[MAXN],cur[MAXN];
bool bfs()
{
	for(int i=0;i<=t;i++) vis[i]=dis[i]=0;
	queue<int>q;
	q.push(s);
	vis[s]=1;
	cur[s]=head[s];
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=Edge_[i].nxt)
		{
			int to=Edge_[i].to;
			if(!Edge_[i].val||vis[to]) continue;
			vis[to]=1;
			dis[to]=dis[u]+1;
			cur[to]=head[to];
			q.push(to);
		}
	}
	return dis[t];
}
int dfs(int x,int sum)
{
	if(x==t) return sum;
	int res=0;
	for(int i=cur[x];i&&sum;i=Edge_[i].nxt)
	{
		int to=Edge_[i].to;
		cur[x]=i;
		if(!Edge_[i].val||dis[to]!=dis[x]+1) continue;
		int k=dfs(to,min(sum,Edge_[i].val));
		if(!k) dis[to]=inf;
		sum-=k;
		res+=k;
		Edge_[i].val-=k;
		Edge_[i^1].val+=k;
	}
	return res;
}
int ans;
void init()
{
	ans=0;
	memset(head,0,sizeof head);
	memset(Edge_,0,sizeof Edge_);
	totr=1;
}
signed main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(nullptr),cout.tie(nullptr);
	while(scanf("%lld%lld%lld%lld%lld%lld%lld",&n,&as,&at,&acnt,&bs,&bt,&bcnt)!=EOF)
	{
		int f=0;
		init();
//		cin>>n>>as>>at>>acnt>>bs>>bt>>bcnt;
		for(int i=0;i<n;i++) scanf("%s",G[i]);
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(G[i][j]=='N')
				{
					Add_edge(i,j,inf);
//					Add_edge(j,i,inf);
				}
				else if(G[i][j]=='O')
				{
					Add_edge(i,j,1);
//					Add_edge(j,i,1);
				}
			}
		}
		s=n,t=n+1;
		Add_edge(s,as,acnt);
		Add_edge(as,s,0);
		Add_edge(s,bs,bcnt);
		Add_edge(bs,s,0);
		Add_edge(at,t,acnt);
		Add_edge(t,at,0);
		Add_edge(bt,t,bcnt);
		Add_edge(t,bt,0);
		while(bfs()) ans+=dfs(s,inf);
		if(ans==acnt+bcnt) f++;
		if(!f)
		{
			puts("No");
			continue;
		}
//		printf("f=%d\n",f);
		init();
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(G[i][j]=='N')
				{
					Add_edge(i,j,inf);
//					Add_edge(j,i,inf);
				}
				else if(G[i][j]=='O')
				{
					Add_edge(i,j,1);
//					Add_edge(j,i,1);
				}
			}
		}
		swap(bs,bt);
//		s=n,t=n+1;
		Add_edge(s,as,acnt);
		Add_edge(as,s,0);
		Add_edge(s,bs,bcnt);
		Add_edge(bs,s,0);
		Add_edge(at,t,acnt);
		Add_edge(t,at,0);
		Add_edge(bt,t,bcnt);
		Add_edge(t,bt,0);
		while(bfs()) ans+=dfs(s,inf);
		if(ans==acnt+bcnt) f++;
		if(f==2) puts("Yes");
		else puts("No");
//		printf("f=%d\n",f);
//		s=as,t=at;
//		while(bfs()) ans+=dfs(s,inf);
//		if(ans>=acnt) f++;
//		s=bs,t=bt;
//		ans=0;
//		while(bfs()) ans+=dfs(s,inf);
//		if(ans>=bcnt) f++;
//		(f==2)?puts("Yes"):puts("No");
//		f==2?cout<<"Yes\n":cout<<"No\n";
	}
	return 0;
}
/*
4 0 1 1 2 3 1
XOXX
OXOX
XOXO
XXOX
4 0 2 1 1 3 2
XNXO
NNNX
XXNN
OXXO
*/

数据: 4 0 2 1 1 3 2

XNXO

NNNX

XXNN

OXXO

2023/11/2 20:55
加载中...