• [CQOI2014]危桥 [网络流 最大流]


    [BZOJ3504] [luoguP3163]

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<cmath>
    #include<stack>
    using namespace std;
    #define Min(x,y) ((x)<(y)?(x):(y))
    const int N=100+50,M=40000+5,inf=0x3f3f3f3f,P=19650827;
    int nw,n,a1,a2,an,b1,b2,bn,s,t,pre[N],incf[N];
    char S[N][N];
    template <class t>void rd(t &x){
        x=0;int w=0;char ch=0;
        while(!isdigit(ch)) w|=ch=='-',ch=getchar();
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
        x=w?-x:x;
    }
    
    int head[N],tot=1;
    struct edge{int v,flo,nxt;}e[N*N<<1];
    void add(int u,int v,int flo){
    	e[++tot]=(edge){v,flo,head[u]},head[u]=tot;
    	e[++tot]=(edge){u,0,head[v]},head[v]=tot;
    }
    
    queue<int>q;bool vis[N];
    bool bfs(){
    	while(!q.empty()) q.pop();
    	memset(vis,0,sizeof(vis));
    	q.push(s),vis[s]=1,incf[s]=inf;
    	while(!q.empty()){
    		int u=q.front();q.pop();
    		for(int i=head[u],v;i;i=e[i].nxt)
    		if(e[i].flo&&!vis[v=e[i].v]){
    			incf[v]=Min(incf[u],e[i].flo);
    			q.push(v),vis[v]=1,pre[v]=i;
    			if(v==t) return 1;
    		}
    	}
    	return 0;
    }
    void upd(){
    	int x=t;
    	while(x!=s){
    		int i=pre[x];
    		e[i].flo-=incf[t],e[i^1].flo+=incf[t];
    		x=e[i^1].v;
    	}
    	nw+=incf[t];
    }
    
    int main(){
    	freopen("in2.txt","r",stdin);
    	//freopen("xor.out","w",stdout);
    	while(scanf("%d%d%d%d%d%d%d",&n,&a1,&a2,&an,&b1,&b2,&bn)!=EOF){
    		tot=1;memset(head,0,sizeof(head));
    		for(int i=1;i<=n;++i){
    			scanf("%s",S[i]+1);
    			for(int j=1;j<=n;++j)
    			if(i!=j){
    				if(S[i][j]=='O') add(i-1,j-1,2);
    				if(S[i][j]=='N') add(i-1,j-1,inf);
    			}
    		}
    		s=n<<1|1,t=s+1;
    		add(s,a1,an<<1),add(s,b1,bn<<1),add(a2,t,an<<1),add(b2,t,bn<<1);
    		nw=0; while(bfs())
    		 upd();
    		if(nw!=(an+bn)<<1) {puts("No");continue;}
    		tot=1;memset(head,0,sizeof(head));
    		for(int i=1;i<=n;++i)
    			for(int j=1;j<=n;++j)
    			if(i!=j){
    				if(S[i][j]=='O') add(i-1,j-1,2);
    				if(S[i][j]=='N') add(i-1,j-1,inf);
    			}
    		add(s,a1,an<<1),add(s,b2,bn<<1),add(a2,t,an<<1),add(b1,t,bn<<1);
    		nw=0; while(bfs()) upd();
    		if(nw!=(an+bn)<<1) puts("No");
    		else puts("Yes");
    	}
    	return 0;
    }
    
  • 相关阅读:
    排序算法-简单选择排序
    pygame模块的简介
    python设计模式之工厂模式
    一次完整的HTTP请求流程(当我们在浏览器输入一个URL后,发生了什么)
    HTTP协议,TCP、UDP协议
    Django rest framework框架中有哪些组件
    flask
    Flask上下文管理
    mac如何开启两个vmware虚拟机
    HTTP状态码
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/11415076.html
Copyright © 2020-2023  润新知