[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;
}