zoukankan      html  css  js  c++  java
  • 【BZOJ 3504 】[Cqoi2014]危桥

    好像 无向图并没有什么处理...
    没用邻接表 慢了很多.....

    /**************************************************************
        Problem: 3504
        User: sxb_201
        Language: C++
        Result: Accepted
        Time:1136 ms
        Memory:3616 kb
    ****************************************************************/
     
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
     
    #define MAXN 25000
    #define INF 100000000
    int s,t;
    int n,a1,a2,an,b1,b2,bn;
    int a[500][500],b[500][500];
    int team[MAXN*4],head,tail;
    int d[500];
    bool bfs(int a[][500])
    {
        head=tail=0;memset(d,0,sizeof(d));
        d[s]=1;team[++tail]=s;
        while(head<tail)
        {
            int x=team[++head];
            for(int i=1;i<=n;i++)
                if(d[i]==0&&a[x][i])
                    d[i]=d[x]+1,team[++tail]=i;
        }
        if(d[t]==0) return false;
        else        return true;
    }
    int dfs(int x,int mmin,int a[][500])
    {
        int tmp;if(x==t) return mmin;
        int flow=0;
        for(int i=1;i<=n;i++)
            if(d[i]==d[x]+1&&(tmp=dfs(i,min(mmin,a[x][i]),a)))
            {
                a[x][i]-=tmp,a[i][x]+=tmp,mmin-=tmp,flow+=tmp;
                if(mmin==0) return flow;
            }
        return flow;
    }
    bool dinic(int a[][500])
    {
        int ans=0;
        while(bfs(a)) ans+=dfs(s,INF,a);
        if(ans==an+bn) return true;
        else        return false;
    }
    int main()
    {
        while(scanf("%d %d %d %d %d %d %d",&n,&a1,&a2,&an,&b1,&b2,&bn)==7)
        {
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            char c=getchar();
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    c=getchar();
                    if(c=='X')
                        ;
                    else if(c=='O')
                        a[i][j]=2,b[i][j]=2;
                    else
                        a[i][j]=INF,b[i][j]=INF;
                }
                c=getchar();
            }
            a1++,a2++,b1++,b2++;
            s=++n,t=++n;
            an*=2,bn*=2;
            a[s][a1]=an;a[s][b1]=bn;
            a[a2][t]=INF;a[b2][t]=INF;
            if(dinic(a)==false) {printf("%s\n","No");continue;}
            b[s][a1]=an;b[s][b2]=bn;
            b[a2][t]=INF;b[b1][t]=INF;
            if(dinic(b)==false) {printf("%s\n","No");continue;}
            printf("%s\n","Yes");
        }
        return 0;
    }
    
    
  • 相关阅读:
    TortoiseGit安装与配置
    Git GUI安装与配置
    Java小知识点
    form中button未设置type值时点击后提交表单
    文件上传下载学习笔记
    Listener--监听器学习笔记
    验证多个Filter过滤一个资源时执行顺序
    Filter--过滤器学习笔记
    Spring的DAO异常-你可能忽视的异常
    web安全浅析
  • 原文地址:https://www.cnblogs.com/ofsxb/p/5106683.html
Copyright © 2011-2022 走看看