zoukankan      html  css  js  c++  java
  • hihoCoder 1252 Kejin Game

    2015 ACM / ICPC 北京站 D题

    网络最大流

    和同学讨论了一会儿,还是Xiang578机智... ...

    /* ***********************************************
    Author        :周甄陶
    Email         :774388357@qq.com
    Created Time  :2015/11/19 22:32:32
    File Name     :acmacm.cpp
    ************************************************ */
    
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    
    const int maxn = 500*2+10;
    const int INF = 0x7FFFFFFF;
    struct Edge
    {
        int from, to, cap, flow;
        Edge(int u, int v, int c, int f) :from(u), to(v), cap(c), flow(f){}
    };
    vector<Edge>edges;
    vector<int>G[maxn];
    bool vis[maxn];
    int d[maxn];
    int cur[maxn];
    int n, m, s, t;
    int S;
    int U[10000+10],V[10000+10],Cost[10000+10];
    int P[maxn],D[maxn];
    
    void init()
    {
        for (int i = 0; i < maxn; i++) G[i].clear();
        edges.clear();
    }
    
    void AddEdge(int from, int to, int cap)
    {
        edges.push_back(Edge(from, to, cap, 0));
        edges.push_back(Edge(to, from, 0, 0));
        int w = edges.size();
        G[from].push_back(w - 2);
        G[to].push_back(w - 1);
    }
    
    bool BFS()
    {
        memset(vis, 0, sizeof(vis));
        queue<int>Q;
        Q.push(s);
        d[s] = 0;
        vis[s] = 1;
        while (!Q.empty())
        {
            int x = Q.front();
            Q.pop();
            for (int i = 0; i<G[x].size(); i++)
            {
                Edge e = edges[G[x][i]];
                if (!vis[e.to] && e.cap>e.flow)
                {
                    vis[e.to] = 1;
                    d[e.to] = d[x] + 1;
                    Q.push(e.to);
                }
            }
        }
        return vis[t];
    }
    
    int DFS(int x, int a)
    {
        if (x == t || a == 0)
            return a;
        int flow = 0, f;
        for (int &i = cur[x]; i<G[x].size(); i++)
        {
            Edge e = edges[G[x][i]];
            if (d[x]+1 == d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0)
            {
                edges[G[x][i]].flow+=f;
                edges[G[x][i] ^ 1].flow-=f;
                flow+=f;
                a-=f;
                if(a==0) break;
            }
        }
        if(!flow) d[x] = -1;
        return flow;
    }
    
    int dinic(int s, int t)
    {
        int flow = 0;
        while (BFS())
        {
            memset(cur, 0, sizeof(cur));
            flow += DFS(s, INF);
        }
        return flow;
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            init();
            scanf("%d%d%d",&n,&m,&S);
            for(int i=1;i<=m;i++)
                scanf("%d%d%d",&U[i],&V[i],&Cost[i]);
            for(int i=1;i<=n;i++) scanf("%d",&P[i]);
            for(int i=1;i<=n;i++) scanf("%d",&D[i]);
            for(int i=1;i<=n;i++) AddEdge(i,i+n,D[i]);
            for(int i=1;i<=n;i++) AddEdge(0,i,P[i]);
            for(int i=1;i<=m;i++) AddEdge(U[i]+n,V[i],Cost[i]);
            AddEdge(S+n,n+n+1,INF);
            s=0; t=n+n+1;
            printf("%d
    ",dinic(s,t));
        }
        return 0;
    }
  • 相关阅读:
    【SCOI 2011】 糖果
    【POJ 3159】 Candies
    【POJ 1716】 Integer Intervals
    【POJ 2983】 Is the information reliable?
    【POJ 1364】 King
    【POJ 1201】 Intervals
    【POJ 1804】 Brainman
    6月10日省中提高组题解
    【POJ 3352】 Road Construction
    【POJ 1144】 Network
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4979364.html
Copyright © 2011-2022 走看看