社区讨论

mnzn 刚学网络流20分求调玄关

P3163[CQOI2014] 危桥参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lpzhg88f
此快照首次捕获于
2023/12/10 20:50
2 年前
此快照最后确认于
2023/12/10 20:59
2 年前
查看原帖
过了#8,#9
上loj上找了反例。
CPP
7 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 条回复,欢迎继续交流。

正在加载回复...