• 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
    ",solver.MaxFlow(s,t));
        }
    }
    View Code
  • 相关阅读:
    vue项目中,设置所有的input框不能输入空格
    自定义vue-baidu-map 组件的信息窗体infowindow(百度地图信息窗体)
    协程
    线程池--进程池--回调函数
    线程基本内容
    进程基本内容
    锁--互斥锁
    socketserver模块实现并发
    tcp的粘包现象
    一些内置的魔术方法
  • 原文地址:https://www.cnblogs.com/acmdeweilai/p/3295637.html
Copyright © 2020-2023  润新知