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
  • 相关阅读:
    MySQL 性能调优之索引
    MySQL 性能调优之存储引擎
    MySQL数据类型优化—整数类型优化选择
    MySQL数据性能优化-修改方法与步骤
    MySQL设计SQL语句优化规范
    MySQL索引的设计、使用和优化
    MySQL的SQL语句优化-group by语句的优化
    SQL性能优化-order by语句的优化
    MySQL查询优化注意下面的四个细节
    优化MySQL性能的几种方法-总结
  • 原文地址:https://www.cnblogs.com/LJB666/p/11432141.html
Copyright © 2011-2022 走看看