#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