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