这是判自环的:```cpp #include <bits/stdc++.h> using namespace std; #define int long long const int MAXN = 1e6+1e3; const int inf = 2e9; int n,as,at,acnt,bs,bt,bcnt; int s,t; char G[62][62]; struct Edge { int from; int to; int nxt; int val; }Edge_[MAXN<<1]; int totr=1,head[MAXN]; void Add_edge(int from,int to,int val) { totr++; Edge_[totr].nxt=head[from]; Edge_[totr].from=from; Edge_[totr].to=to; Edge_[totr].val=val; head[from]=totr; } int vis[MAXN],dis[MAXN],cur[MAXN]; bool bfs() { for(int i=0;i<=t;i++) vis[i]=dis[i]=0; queueq; q.push(s); vis[s]=1; cur[s]=head[s]; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i;i=Edge_[i].nxt) { int to=Edge_[i].to; if(!Edge_[i].val||vis[to]) continue; vis[to]=1; dis[to]=dis[u]+1; cur[to]=head[to]; q.push(to); } } return dis[t]; } int dfs(int x,int sum) { if(x==t) return sum; int res=0; for(int i=cur[x];i&∑i=Edge_[i].nxt) { int to=Edge_[i].to; cur[x]=i; if(!Edge_[i].val||dis[to]!=dis[x]+1) continue; int k=dfs(to,min(sum,Edge_[i].val)); if(!k) dis[to]=inf; sum-=k; res+=k; Edge_[i].val-=k; Edge_[i^1].val+=k; } return res; } int ans; void init() { ans=0; memset(head,0,sizeof head); memset(Edge_,0,sizeof Edge_); totr=1; } signed main() { // ios::sync_with_stdio(false); // cin.tie(nullptr),cout.tie(nullptr); while(scanf("%lld%lld%lld%lld%lld%lld%lld",&n,&as,&at,&acnt,&bs,&bt,&bcnt)!=EOF) { int f=0; init(); // cin>>n>>as>>at>>acnt>>bs>>bt>>bcnt; for(int i=0;i<n;i++) scanf("%s",G[i]); for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { if(G[i][j]=='N') { Add_edge(i,j,inf); Add_edge(j,i,inf); } else if(G[i][j]=='O') { Add_edge(i,j,1); Add_edge(j,i,1); } } } s=n,t=n+1; Add_edge(s,as,acnt); Add_edge(as,s,0); Add_edge(s,bs,bcnt); Add_edge(bs,s,0); Add_edge(at,t,acnt); Add_edge(t,at,0); Add_edge(bt,t,bcnt); Add_edge(t,bt,0); while(bfs()) ans+=dfs(s,inf); if(ans==acnt+bcnt) f++; if(!f) { puts("No"); continue; } // printf("f=%d\n",f); init(); for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { if(G[i][j]=='N') { Add_edge(i,j,inf); Add_edge(j,i,inf); } else if(G[i][j]=='O') { Add_edge(i,j,1); Add_edge(j,i,1); } } } swap(bs,bt); // s=n,t=n+1; Add_edge(s,as,acnt); Add_edge(as,s,0); Add_edge(s,bs,bcnt); Add_edge(bs,s,0); Add_edge(at,t,acnt); Add_edge(t,at,0); Add_edge(bt,t,bcnt); Add_edge(t,bt,0); while(bfs()) ans+=dfs(s,inf); if(ans==acnt+bcnt) f++; if(f==2) puts("Yes"); else puts("No"); // printf("f=%d\n",f); // s=as,t=at; // while(bfs()) ans+=dfs(s,inf); // if(ans>=acnt) f++; // s=bs,t=bt; // ans=0; // while(bfs()) ans+=dfs(s,inf); // if(ans>=bcnt) f++; // (f==2)?puts("Yes"):puts("No"); // f==2?cout<<"Yes\n":cout<<"No\n"; } return 0; } /* 4 0 1 1 2 3 1 XOXX OXOX XOXO XXOX 4 0 2 1 1 3 2 XNXO NNNX XXNN OXXO */
这是不判的:```cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 1e6+1e3;
const int inf = 2e9;
int n,as,at,acnt,bs,bt,bcnt;
int s,t;
char G[62][62];
struct Edge
{
int from;
int to;
int nxt;
int val;
}Edge_[MAXN<<1];
int totr=1,head[MAXN];
void Add_edge(int from,int to,int val)
{
totr++;
Edge_[totr].nxt=head[from];
Edge_[totr].from=from;
Edge_[totr].to=to;
Edge_[totr].val=val;
head[from]=totr;
}
int vis[MAXN],dis[MAXN],cur[MAXN];
bool bfs()
{
for(int i=0;i<=t;i++) vis[i]=dis[i]=0;
queue<int>q;
q.push(s);
vis[s]=1;
cur[s]=head[s];
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i;i=Edge_[i].nxt)
{
int to=Edge_[i].to;
if(!Edge_[i].val||vis[to]) continue;
vis[to]=1;
dis[to]=dis[u]+1;
cur[to]=head[to];
q.push(to);
}
}
return dis[t];
}
int dfs(int x,int sum)
{
if(x==t) return sum;
int res=0;
for(int i=cur[x];i&∑i=Edge_[i].nxt)
{
int to=Edge_[i].to;
cur[x]=i;
if(!Edge_[i].val||dis[to]!=dis[x]+1) continue;
int k=dfs(to,min(sum,Edge_[i].val));
if(!k) dis[to]=inf;
sum-=k;
res+=k;
Edge_[i].val-=k;
Edge_[i^1].val+=k;
}
return res;
}
int ans;
void init()
{
ans=0;
memset(head,0,sizeof head);
memset(Edge_,0,sizeof Edge_);
totr=1;
}
signed main()
{
// ios::sync_with_stdio(false);
// cin.tie(nullptr),cout.tie(nullptr);
while(scanf("%lld%lld%lld%lld%lld%lld%lld",&n,&as,&at,&acnt,&bs,&bt,&bcnt)!=EOF)
{
int f=0;
init();
// cin>>n>>as>>at>>acnt>>bs>>bt>>bcnt;
for(int i=0;i<n;i++) scanf("%s",G[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(G[i][j]=='N')
{
Add_edge(i,j,inf);
// Add_edge(j,i,inf);
}
else if(G[i][j]=='O')
{
Add_edge(i,j,1);
// Add_edge(j,i,1);
}
}
}
s=n,t=n+1;
Add_edge(s,as,acnt);
Add_edge(as,s,0);
Add_edge(s,bs,bcnt);
Add_edge(bs,s,0);
Add_edge(at,t,acnt);
Add_edge(t,at,0);
Add_edge(bt,t,bcnt);
Add_edge(t,bt,0);
while(bfs()) ans+=dfs(s,inf);
if(ans==acnt+bcnt) f++;
if(!f)
{
puts("No");
continue;
}
// printf("f=%d\n",f);
init();
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(G[i][j]=='N')
{
Add_edge(i,j,inf);
// Add_edge(j,i,inf);
}
else if(G[i][j]=='O')
{
Add_edge(i,j,1);
// Add_edge(j,i,1);
}
}
}
swap(bs,bt);
// s=n,t=n+1;
Add_edge(s,as,acnt);
Add_edge(as,s,0);
Add_edge(s,bs,bcnt);
Add_edge(bs,s,0);
Add_edge(at,t,acnt);
Add_edge(t,at,0);
Add_edge(bt,t,bcnt);
Add_edge(t,bt,0);
while(bfs()) ans+=dfs(s,inf);
if(ans==acnt+bcnt) f++;
if(f==2) puts("Yes");
else puts("No");
// printf("f=%d\n",f);
// s=as,t=at;
// while(bfs()) ans+=dfs(s,inf);
// if(ans>=acnt) f++;
// s=bs,t=bt;
// ans=0;
// while(bfs()) ans+=dfs(s,inf);
// if(ans>=bcnt) f++;
// (f==2)?puts("Yes"):puts("No");
// f==2?cout<<"Yes\n":cout<<"No\n";
}
return 0;
}
/*
4 0 1 1 2 3 1
XOXX
OXOX
XOXO
XXOX
4 0 2 1 1 3 2
XNXO
NNNX
XXNN
OXXO
*/
数据: 4 0 2 1 1 3 2
XNXO
NNNX
XXNN
OXXO