码迷,mamicode.com
首页 > 其他好文 > 详细

BeiJing2006 狼抓兔子

时间:2017-11-01 12:17:31      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:str   return   his   tchar   sdi   cto   amp   define   read   

#include <bits/stdc++.h>
#define MAXN 1000001
#define mset(a,b) memset(a,b,sizeof(a))
#define inf 214700000
using namespace std;
struct Dinic{
    struct Edge{
        int to,w;
    };
    int T,S,vis[MAXN];
    vector<int> mp[MAXN];
    vector<Edge> e;
    void addEdge(int a,int b,int c){
        mp[a].push_back(e.size());
        e.push_back((Edge){b,c});
        mp[b].push_back(e.size());
        e.push_back((Edge){a,c});
    }
    bool bfs(){
        mset(vis,0);
        queue<int> q;
        q.push(S);
        vis[S]=1;
        while(!q.empty()){
            int a=q.front();
            if(a==T)
                return true;
            for(int i=0;i<mp[a].size();i++){
                Edge now=e[mp[a][i]];
                if(!vis[now.to]&&now.w){
                    vis[now.to]=vis[a]+1;
                    q.push(now.to);
                }
            }
            q.pop();
        }
        return false;
    }
    int dfs(int d,int maxn){
        int ans=0;
        if(d==T)
            return maxn;
        if(!maxn)
            return 0;
        for(int i=0;i<mp[d].size();i++){
            Edge now=e[mp[d][i]];
            if(!~(vis[d]-vis[now.to])&&now.w){
                int w=dfs(now.to,min(maxn-ans,now.w));
                e[mp[d][i]].w-=w;
                e[mp[d][i]^1].w+=w;
                ans+=w;
                if(ans==maxn)
                    return ans;
            }
        }
        if(!ans)
            vis[d]=-1;
        return ans;
    }
    int GetAns(){
        int ans=0;
        while(bfs())
            ans+=dfs(S,inf);
        return ans;
    }
};
struct IOer{
	int ReadInt(){
		char c=getchar();
        bool f=false;
        int a=0;
        while(!isdigit(c)){
            if(c==‘-‘)
                f=true;
            c=getchar();
        }
        while(isdigit(c)){
            a=(a<<1)+(a<<3)+c-‘0‘;
            c=getchar();
        }
        if(f)
            a=~a+1;
        return a;
	}
    IOer operator << (int a){
        int s[100],top=0;
        if(!a){
            putchar(‘0‘);
            return *this;
        }
        if(a<0){
            putchar(‘-‘);
            a=~a+1;
        }
        while(a){
            s[top++]=a%10;
            a/=10;
        }
        top--;
        while(~top)
            putchar(s[top--]+‘0‘);
        return *this;
    }
    IOer operator << (char c){
        putchar(c);
        return *this;
    }
    IOer operator >> (int &a){
        char c=getchar();
        bool f=false;
        a=0;
        while(!isdigit(c)){
            if(c==‘-‘)
                f=true;
            c=getchar();
        }
        while(isdigit(c)){
            a=(a<<1)+(a<<3)+c-‘0‘;
            c=getchar();
        }
        if(f)
            a=~a+1;
        return *this;
    }
};
int main(){
int n,m;
IOer io;
Dinic d;
	io>>n>>m;
	d.S=1;d.T=n*m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<m;j++)
			d.addEdge((i-1)*m+j,(i-1)*m+j+1,io.ReadInt());
	for(int i=1;i<n;i++)
		for(int j=1;j<=m;j++)
			d.addEdge((i-1)*m+j,i*m+j,io.ReadInt());
	for(int i=1;i<n;i++)
		for(int j=1;j<m;j++)
			d.addEdge((i-1)*m+j,i*m+j+1,io.ReadInt());
	io<<d.GetAns()<<‘\n‘;
	return 0;
}

  

BeiJing2006 狼抓兔子

标签:str   return   his   tchar   sdi   cto   amp   define   read   

原文地址:http://www.cnblogs.com/HC-LittleJian/p/7765447.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!