• POJ 1459 Power Network 最大流(Edmonds_Karp算法)


    题目链接: http://poj.org/problem?id=1459

    因为发电站有多个,所以需要一个超级源点,消费者有多个,需要一个超级汇点,这样超级源点到发电站的权值就是发电站的容量,也就是题目中的pmax,消费者到超级汇点的权值就是消费者的容量,也就是题目中的cmax。初学网络流,第一眼看到这个题还以为应该先做一遍EK算法,然后减去max(p-pmax, c-cmax)呢。。没想到这个题的难点就是建图而已。。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <queue>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const int INF = 0x3f3f3f3f;
     8 int cap[110][110], flow[110][110], res[110], pre[110];
     9 int start, end;
    10 int n_node, n_power, n_consumer, n_line;
    11 queue<int>que;
    12 
    13 int Edmonds_Karp()
    14 {
    15     while(!que.empty())que.pop();
    16     int flow_sum = 0;
    17     while(true)
    18     {
    19         memset(res, 0, sizeof(res));
    20         res[start] = INF;
    21         que.push(start);
    22         while(!que.empty())
    23         {
    24             int u = que.front();
    25             que.pop();
    26             for(int v = 0; v < n_node+2; v++)
    27             {
    28                 if(!res[v] && cap[u][v] > flow[u][v])
    29                 {
    30                     pre[v] = u;
    31                     que.push(v);
    32                     res[v] = min(res[u], cap[u][v] - flow[u][v]);
    33                 }
    34             }
    35         }
    36         if(res[end] == 0)break;
    37         for(int u = end; u != start; u = pre[u])
    38         {
    39             flow[pre[u]][u] += res[end];
    40             flow[u][pre[u]] -= res[end];
    41         }
    42         flow_sum += res[end];
    43     }
    44     return flow_sum;
    45 }
    46 
    47 int main()
    48 {
    49     char fuck_space[110];//18禁。。
    50     while(scanf("%d %d %d %d", &n_node, &n_power, &n_consumer, &n_line) != EOF)
    51     {
    52         int u, v, w;
    53         memset(cap, 0, sizeof(cap));
    54         memset(flow, 0, sizeof(flow));
    55         start = n_node;
    56         end = n_node+1;
    57         for(int i = 0; i < n_line; i++)
    58         {
    59             scanf("%s", fuck_space);
    60             sscanf(fuck_space, "(%d,%d)%d", &u, &v, &w);
    61             cap[u][v] += w;
    62         }
    63         for(int i = 0; i < n_power; i++)
    64         {
    65             scanf("%s", fuck_space);
    66             sscanf(fuck_space, "(%d)%d", &u, &w);
    67             cap[start][u] += w;
    68         }
    69         for(int i = 0; i < n_consumer; i++)
    70         {
    71             scanf("%s", fuck_space);
    72             sscanf(fuck_space, "(%d)%d", &u, &w);
    73             cap[u][end] += w;
    74         }
    75         printf("%d
    ", Edmonds_Karp());
    76     }
    77     return 0;
    78 }
    View Code
  • 相关阅读:
    HDU_2191_多重背包
    HDU_1494_dp
    POJ_1088_dfs
    所有的畅通工程[HDU1232][HDU1874][HDU1875][HDU1879]
    畅通工程[HDU1863]
    还是畅通工程[HDU1233]
    最小生成树
    Who's in the Middle[HDU1157]
    Bungee Jumping[HDU1155]
    Is It A Tree?[HDU1325][PKU1308]
  • 原文地址:https://www.cnblogs.com/wolfred7464/p/3250199.html
Copyright © 2020-2023  润新知