judge两次
1:S连a1 b1;a2 b2 连T
2:S连a1 b2;a2 b1 连T
窝用的是矩阵存的边……
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<iostream>
#include<algorithm>
#define T 99999
using namespace std;
int v[55][55],dis[55],q[55],y[55][55];
int n,a1,a2,an,b1,b2,bn,S,W;
bool BFS()
{
for(int i=0;i<=W;i++)dis[i]=0; dis[S]=1;
int l=1,r=2;q[1]=S;
while(l<r)
{
int x=q[l++];
for(int i=0;i<=W;i++)
if(v[x][i]&&!dis[i])
{
dis[i]=dis[x]+1;
q[r++]=i;
}
}
return dis[W];
}
int dfs(int x,int f)
{
int ww=0,w;
if(x==W)return f;
for(int i=0;i<=W;i++)
if(v[x][i]&&dis[i]==dis[x]+1)
{
w=dfs(i,min(v[x][i],f-ww));
ww+=w; v[x][i]-=w; v[i][x]+=w;
if(f==ww)return ww;
}
return ww;
}
bool jud()
{
int used=0;
while(BFS()) used+=dfs(S,T);
return used==2*(an+bn);
}
int main()
{
while(scanf("%d%d%d%d%d%d%d",&n,&a1,&a2,&an,&b1,&b2,&bn)!=EOF)
{
memset(v,0,sizeof(v));
for(int i=0;i<n;i++)
{
char s[55];
scanf("%s",s);
for(int j=0;j<n;j++)
{
if(s[j]=='O')v[i][j]=2;
else if(s[j]=='N')v[i][j]=T;
y[i][j]=v[i][j];
}
}
S=n,W=S+1;
v[S][a1]=2*an; v[S][b1]=2*bn; v[b2][W]=2*bn; v[a2][W]=2*an;
if(!jud()){puts("No");continue;}
memset(v,0,sizeof(v));
for(int i=0;i<n;i++) for(int j=0;j<n;j++)v[i][j]=y[i][j];
v[S][a1]=2*an; v[S][b2]=2*bn; v[b1][W]=2*bn; v[a2][W]=2*an;
if(!jud()){puts("No");continue;}
puts("Yes");
}
return 0;
}