hdu 4280 最大流

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4280

 

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;

const int maxn = 100005;
const int maxe = 500000;
const int INF = 0x3f3f3f;

struct Edge{
    int v,flow,cap;
    int next;
    Edge(int v=0,int flow=0,int cap=0,int next=0):
        v(v) , flow(flow),  cap(cap),  next(next){}

};

struct Dinic{
    Edge edges[maxe];
    int head[maxn],cnt;
    int cur[maxn];
    int d[maxn];
    int vis[maxn];
    int s,t;

    void init(){
        memset(head,-1,sizeof(head));
        cnt = 0;
    }

    void addedge(int u,int v,int cap){
        edges[cnt] = Edge(v,0,cap,head[u]);
        head[u] = cnt++;
        edges[cnt] = Edge(u,0,cap,head[v]);
        head[v] = cnt++;
    }

    bool bfs(){
        memset(vis,0,sizeof(vis));
        queue<int> Q;
        Q.push(s);
        vis[s] = true;
        d[s] = 0;
        while(!Q.empty()){
            int u = Q.front();  Q.pop();
            for(int i=head[u];i!=-1;i=edges[i].next){
                Edge& e = edges[i];
                if(!vis[e.v] && e.cap > e.flow){
                    vis[e.v] = true;
                    d[e.v] = d[u] + 1;
                    Q.push(e.v);
                }
            }
        }
        return vis[t];
    }

    int dfs(int u,int res){
        if(u == t || res == 0)   return res;
        int flow = 0,f;
        for(int& i=cur[u];i!=-1;i=edges[i].next){
            Edge& e = edges[i];
            if(d[e.v] == d[u] + 1 && (f = dfs(e.v,min(res,e.cap-e.flow))) > 0){
                e.flow += f;
                edges[i^1].flow -= f;
                flow += f;
                res -= f;
                if(res == 0) break;
            }
        }
        return flow;
    }

    int MaxFlow(int s_,int t_){
        s = s_;  t = t_;
        int flow = 0;
        while(bfs()){
            for(int i=0;i<=maxn;i++)  cur[i] = head[i];
            flow += dfs(s,INF);
        }

        return  flow;
    }

}solver;

int main()
{
    freopen("E:\\acm\\input.txt","r",stdin);
    int T;
    cin>>T;
    while(T--){
        solver.init();
        int N,M;
        cin>>N>>M;
        int maxx=-INF,minx=INF;
        int s,t;
        for(int i=1;i<=N;i++){
            int x,y;
            scanf("%d %d",&x,&y);
            if(maxx < x){
                maxx = x;
                t = i;
            }
            if(minx > x){
                minx = x;
                s = i;
            }
        }
        for(int i=1;i<=M;i++){
            int a,b,c;
            scanf("%d %d %d",&a,&b,&c);
            solver.addedge(a,b,c);
        }
        printf("%d\n",solver.MaxFlow(s,t));
    }
}
View Code

 

 

 

posted @ 2013-09-01 22:58  等待最好的两个人  阅读(163)  评论(0编辑  收藏  举报