zoukankan      html  css  js  c++  java
  • BZOJ1001 狼抓兔子 网络最大流

    题目链接

    其实这道题看着挺麻烦的,但实际上就是网络最大流的模板题,把所有的横向边,纵向边,斜向边建图,跑网络最大流dinic即可。

    #include<cstdio>
    #include<iostream>
    #include<queue>
    #include<cstring>
    using namespace std;
    const int maxn=1e6+10;
    const int inf=0x3f3f3f3f;
    inline int read(){
        int s = 0, w = 1;
        char ch = getchar();
        while(ch < '0' || ch > '9'){ if(ch == '-') w = -1; ch = getchar(); }
        while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); }
        return s * w;
    }
    struct node{
        int nxt,to,val;
    }edge[maxn*6];
    int head[maxn],cnt;
    int n,m,x;
    int dis[maxn];
    int dep[maxn];
    queue<int> q;
    void add(int x,int y,int v){
        edge[++cnt].nxt=head[x];
        edge[cnt].to=y;
        edge[cnt].val=v;
        head[x]=cnt;
    }
    bool bfs(){
        memset(dep,0,sizeof(dep));
        while(!q.empty()) q.pop();
        dep[1]=1;
        q.push(1);
         while(!q.empty()){
            int u=q.front();
            q.pop();
            for(int i=head[u];i;i=edge[i].nxt){
                int v=edge[i].to;
                if(edge[i].val&&!dep[v]){
                    dep[v]=dep[u]+1;    
                    q.push(v);
                }    
            }
        }
        if(dep[n*m]) return 1;
        else return 0;
    }
    int dfs(int now,int flow){ 
        if(now==n*m||!flow) return flow;
        int dick=0,f;
        for(int i=head[now];i;i=edge[i].nxt){
            int v=edge[i].to;
            if((dep[v]==dep[now]+1)&&(edge[i].val)){
                dick+=(f=dfs(v,min(flow-dick,edge[i].val)));
                edge[i].val-=f;
                edge[i^1].val+=f;
            }
        }
        if(!dick) dep[now]=0;
        return dick;
    } 
    int dinic(){
        int ans=0;
        while(bfs()) ans+=dfs(1,inf);
        return ans;
    }
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){//横向 
            for(int j=1;j<m;j++){
                x=read();
                add(m*(i-1)+j,m*(i-1)+j+1,x);
                add(m*(i-1)+j+1,m*(i-1)+j,x); 
            }
        }
        for(int i=1;i<n;i++){//纵向 
            for(int j=1;j<=m;j++){
                x=read();
                add(m*(i-1)+j,m*i+j,x);
                add(m*i+j,m*(i-1)+j,x);
            }
        }
        for(int i=1;i<n;i++){//斜向 
            for(int j=1;j<m;j++){
                x=read();
                add(m*(i-1)+j,m*i+j+1,x);
                add(m*i+j+1,m*(i-1)+j,x);
            }
        }
        printf("%d
    ",dinic());
        return 0;
    }
    View Code
  • 相关阅读:
    启用EMF的自动生成UUID功能
    关于web开发使用utf8编码所需的配置
    Cognos8安装使用问题记录
    ILOG JViews Diagrammer使用记录
    四种方法修改Palm Simulator使用的ROM
    无光驱笔记本n410c装windows xp总结
    JSF开发问题和解决
    Equinox OSGi服务器应用程序的配置步骤
    从google获得大尺寸地图图片文件
    Amazon EC2配置步骤和一些问题
  • 原文地址:https://www.cnblogs.com/LJB666/p/11432141.html
Copyright © 2011-2022 走看看