社区讨论
mnzn 刚学网络流20分求调玄关
P3163[CQOI2014] 危桥参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lpzhg88f
- 此快照首次捕获于
- 2023/12/10 20:50 2 年前
- 此快照最后确认于
- 2023/12/10 20:59 2 年前
过了#8,#9
上loj上找了反例。
CPP7 4 0 4 2 6 1
XNOXXXX
NXXOOOO
OXXOXOX
XOOXNXX
XOXNXXX
XOOXXXO
XOXXXOX
CPP#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=84,maxm=5e3+84,inf=1e7;
ll n,a1,a2,an,b1,b2,bn,s,t;
char ss[maxn][maxn];
namespace Sherry_Dinic{
struct Edge{
ll to,ne,val;
}e[maxm];
ll ecnt=1,tt,head[maxn],headnow[maxn],dep[maxn];
bool vis[maxn];
inline void add(ll u,ll v,ll w){
e[++ecnt]={v,head[u],w};
head[u]=ecnt;
return ;
}
queue<int> q;
inline bool bfs(){
memcpy(headnow,head,sizeof(head));
memset(vis,0,sizeof(vis));
memset(dep,0x3f,sizeof(dep));
while(!q.empty())
q.pop();
dep[s]=1;
q.push(s);
vis[s]=1;
while(!q.empty()){
tt=q.front();
q.pop();
vis[tt]=0;
for(ll i=head[tt];i;i=e[i].ne)
if(e[i].val&&dep[e[i].to]>dep[tt]+1){
dep[e[i].to]=dep[tt]+1;
if(!vis[e[i].to]){
vis[e[i].to]=1;
q.push(e[i].to);
}
}
}
return dep[t]<1e7;
}
inline ll dfs(ll x,ll fl){
if(x==t)
return fl;
ll tfl,used=0;
for(ll &i=headnow[x];i;i=e[i].ne){
if(e[i].val&&dep[e[i].to]==dep[x]+1){
tfl=dfs(e[i].to,min(fl-used,e[i].val));
if(tfl){
e[i].val-=tfl;
e[i^1].val+=tfl;
used+=tfl;
if(used==fl)
return used;
}
}
}
return used;
}
inline ll Work(){
ll ans=0;
while(bfs())
ans+=dfs(s,inf);
return ans;
}
}
using namespace Sherry_Dinic;
int main(){
while(scanf("%lld",&n)!=EOF){
memset(head,0,sizeof(head));
ecnt=1;
scanf("%lld%lld%lld%lld%lld%lld",&a1,&a2,&an,&b1,&b2,&bn);
a1++;
a2++;
b1++;
b2++;
for(ll i=1;i<=n;i++){
scanf("%s",ss[i]+1);
for(ll j=1;j<=n;j++)
if(i==j)
;
else if(ss[i][j]=='O')
add(i,j,1);
else if(ss[i][j]=='N')
add(i,j,inf);
}
s=n+1;
t=n+2;
add(s,a1,an);
add(a1,s,an);
add(s,b1,bn);
add(b1,s,bn);
add(a2,t,an);
add(t,a2,an);
add(b2,t,bn);
add(t,b2,bn);
if(Work()!=an+bn)
goto no;
memset(head,0,sizeof(head));
memset(e,0,sizeof(e));
ecnt=1;
for(ll i=1;i<=n;i++)
for(ll j=1;j<=n;j++)
if(i==j)
;
else if(ss[i][j]=='O')
add(i,j,1);
else if(ss[i][j]=='N')
add(i,j,inf);
add(s,a1,an);
add(a1,s,an);
add(s,b2,bn);
add(b2,s,bn);
add(a2,t,an);
add(t,a2,an);
add(b1,t,bn);
add(t,b1,bn);
if(Work()==an+bn)
puts("Yes");
else
no:puts("No");
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...