zoukankan      html  css  js  c++  java
  • poj 1459 Power Network(增广路)

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

    题意:有一些发电站,消耗用户和中间线路,求最大流。。

    加一个源点,再加一个汇点。。

    其实,过程还是不大理解。。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <queue>
     6 using namespace std;
     7 
     8 const int INF=1<<29;
     9 int cap[110][110],flow[110][110];
    10 
    11 int Edmonds_Karp(int s,int t,int n)
    12 {
    13     int a[110],p[110];
    14     int f;
    15     queue<int>q;
    16     memset(flow,0,sizeof(flow));
    17     f=0;
    18     while(1)
    19     {
    20         memset(a,0,sizeof(a));
    21         a[s]=INF;
    22         q.push(s);
    23         while(!q.empty())
    24         {
    25             int u=q.front();
    26             q.pop();
    27             for(int v=1; v<=n; v++)
    28             if(!a[v]&&cap[u][v]>flow[u][v])
    29             {
    30                 p[v]=u; q.push(v);
    31                 a[v]=min(a[u],cap[u][v]-flow[u][v]);
    32             }
    33         }
    34         if(a[t]==0) break;
    35         for(int u=t; u!=s; u=p[u])
    36         {
    37             flow[p[u]][u]+=a[t];
    38             flow[u][p[u]]-=a[t];
    39         }
    40         f+=a[t];
    41     }
    42     return f;
    43 }
    44 int main()
    45 {
    46     int n,np,nc,m;
    47     int u,v,w,i;
    48     char s[20];
    49     while(~scanf("%d%d%d%d",&n,&np,&nc,&m))
    50     {
    51         memset(cap,0,sizeof(cap));
    52         for(i=0; i<m; i++)
    53         {
    54             scanf("%s",s);
    55             sscanf(s,"(%d,%d)%d",&u,&v,&w);
    56             u++; v++;
    57             cap[u][v]+=w;
    58         }
    59         for(i=0; i<np; i++)
    60         {
    61             scanf("%s",s);
    62             sscanf(s,"(%d)%d",&v,&w);
    63             v++;
    64             cap[0][v]+=w;
    65         }
    66         for(i=0; i<nc; i++)
    67         {
    68             scanf("%s",s);
    69             sscanf(s,"(%d)%d",&u,&w);
    70             u++;
    71             cap[u][n+1]+=w;
    72         }
    73         printf("%d
    ",Edmonds_Karp(0,n+1,n+1));
    74     }
    75     return 0;
    76 }
  • 相关阅读:
    Flink
    数据工程师
    数据库中间件
    数据仓库
    数据库
    设计模式
    机器学习
    Collections
    Concurrency
    Java
  • 原文地址:https://www.cnblogs.com/bfshm/p/3545533.html
Copyright © 2011-2022 走看看