[CQOI2014]危桥 [网络流 最大流]

[BZOJ3504] [luoguP3163]

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<cmath>
#include<stack>
using namespace std;
#define Min(x,y) ((x)<(y)?(x):(y))
const int N=100+50,M=40000+5,inf=0x3f3f3f3f,P=19650827;
int nw,n,a1,a2,an,b1,b2,bn,s,t,pre[N],incf[N];
char S[N][N];
template <class t>void rd(t &x){
    x=0;int w=0;char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=w?-x:x;
}

int head[N],tot=1;
struct edge{int v,flo,nxt;}e[N*N<<1];
void add(int u,int v,int flo){
	e[++tot]=(edge){v,flo,head[u]},head[u]=tot;
	e[++tot]=(edge){u,0,head[v]},head[v]=tot;
}

queue<int>q;bool vis[N];
bool bfs(){
	while(!q.empty()) q.pop();
	memset(vis,0,sizeof(vis));
	q.push(s),vis[s]=1,incf[s]=inf;
	while(!q.empty()){
		int u=q.front();q.pop();
		for(int i=head[u],v;i;i=e[i].nxt)
		if(e[i].flo&&!vis[v=e[i].v]){
			incf[v]=Min(incf[u],e[i].flo);
			q.push(v),vis[v]=1,pre[v]=i;
			if(v==t) return 1;
		}
	}
	return 0;
}
void upd(){
	int x=t;
	while(x!=s){
		int i=pre[x];
		e[i].flo-=incf[t],e[i^1].flo+=incf[t];
		x=e[i^1].v;
	}
	nw+=incf[t];
}

int main(){
	freopen("in2.txt","r",stdin);
	//freopen("xor.out","w",stdout);
	while(scanf("%d%d%d%d%d%d%d",&n,&a1,&a2,&an,&b1,&b2,&bn)!=EOF){
		tot=1;memset(head,0,sizeof(head));
		for(int i=1;i<=n;++i){
			scanf("%s",S[i]+1);
			for(int j=1;j<=n;++j)
			if(i!=j){
				if(S[i][j]=='O') add(i-1,j-1,2);
				if(S[i][j]=='N') add(i-1,j-1,inf);
			}
		}
		s=n<<1|1,t=s+1;
		add(s,a1,an<<1),add(s,b1,bn<<1),add(a2,t,an<<1),add(b2,t,bn<<1);
		nw=0; while(bfs())
		 upd();
		if(nw!=(an+bn)<<1) {puts("No");continue;}
		tot=1;memset(head,0,sizeof(head));
		for(int i=1;i<=n;++i)
			for(int j=1;j<=n;++j)
			if(i!=j){
				if(S[i][j]=='O') add(i-1,j-1,2);
				if(S[i][j]=='N') add(i-1,j-1,inf);
			}
		add(s,a1,an<<1),add(s,b2,bn<<1),add(a2,t,an<<1),add(b1,t,bn<<1);
		nw=0; while(bfs()) upd();
		if(nw!=(an+bn)<<1) puts("No");
		else puts("Yes");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/lxyyyy/p/11415076.html