zoukankan      html  css  js  c++  java
  • POJ 1459 最大流 第二题

    http://poj.org/problem?id=1459

    也是网络流的基础,只是虚拟出一个源点和终点,对应的生产值和消费值就加到与源点和终点的边上,然后做一次bfs就好了。

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <queue>
      4 #include <algorithm>
      5 #define INF 999999999
      6 //#define OPEN_FILE
      7 using namespace std;
      8 
      9 const int MAXN = 105;
     10 int cap[MAXN][MAXN], flow[MAXN][MAXN], p[MAXN], c[MAXN], f[MAXN];
     11 int n, ans;
     12 
     13 void get_cap(char s[])
     14 {
     15     int i, u, v, w;
     16     u = 0;
     17     for (i = 1; s[i] != ','; i++){
     18         u = u * 10 + (s[i] - '0');
     19     }
     20     v = 0;
     21     for (++i; s[i] != ')'; i++){
     22         v = v * 10 + (s[i] - '0');
     23     }
     24     int len = strlen(s);
     25     w = 0;
     26     for (++i; i < len; i++){
     27         w = w * 10 + (s[i] - '0');
     28     }
     29     cap[u][v] = w;
     30 }
     31 
     32 void get_pc(char s[], int* t, int o)
     33 {
     34     int i, u, w;
     35     u = 0;
     36     for (i = 1; s[i] != ')'; i++){
     37         u = u * 10 + (s[i] - '0');
     38     }
     39     int len = strlen(s);
     40     w = 0;
     41     for (++i; i < len; i++){
     42         w = w * 10 + (s[i] - '0');
     43     }
     44     if (o){
     45         cap[n][u] = w;
     46     }
     47     else{
     48         cap[u][n + 1] = w;
     49     }
     50     
     51 }
     52 
     53 void ek_bfs(){
     54     queue<int> d;
     55     int s, t, u, v;
     56     int a[MAXN];
     57     s = n;
     58     t = n + 1;
     59     ans = 0;
     60     while (1){
     61         memset(a, 0, sizeof(a));
     62         a[s] = INF;
     63         d.push(s);
     64         while (!d.empty()){
     65             u = d.front();
     66             d.pop();
     67             for (v = 0; v <= n + 1; v++){
     68                 if (a[v] || cap[u][v] <= flow[u][v]) continue;
     69                 f[v] = u;
     70                 d.push(v);
     71                 a[v] = min(a[u] , cap[u][v] - flow[u][v]);
     72             }
     73         }
     74         if (a[t] == 0) break;
     75         for (u = t; u != s; u = f[u]){
     76             flow[f[u]][u] += a[t];
     77             flow[u][f[u]] -= a[t];
     78         }
     79         ans += a[t];
     80     }
     81 }
     82 
     83 int main()
     84 {
     85 #ifdef OPEN_FILE
     86     freopen("in.txt", "r", stdin);
     87     freopen("out.txt", "w", stdout);
     88 #endif // OPEN_FILE
     89     int m, np, nc, i, j;
     90     char s[101];
     91     while (~scanf("%d%d%d%d", &n, &np, &nc, &m)){
     92         memset(cap, 0, sizeof(cap));
     93         memset(flow, 0, sizeof(flow));
     94         memset(p, 0, sizeof(p));
     95         memset(c, 0, sizeof(c));
     96         for (i = 1; i <= m; i++){
     97             scanf("%s", s);
     98             get_cap(s);
     99         }
    100         for (i = 1; i <= np; i++){
    101             scanf("%s", s);
    102             get_pc(s, p, 1);
    103         }
    104         for (i = 1; i <= nc; i++){
    105             scanf("%s", s);
    106             get_pc(s, c, 0);
    107         }
    108         ek_bfs();
    109         printf("%d
    ", ans);
    110     }
    111 }
    View Code
  • 相关阅读:
    芯片难题
    permutation
    小凸玩矩阵
    gender
    NOI2019序列非启发式做法
    莫比乌斯函数&莫比乌斯反演
    「雅礼day2」最大公约数gcd
    容斥原理&反演
    树上路径的交和并
    CF906D Power Tower
  • 原文地址:https://www.cnblogs.com/macinchang/p/4452253.html
Copyright © 2011-2022 走看看