您的位置:首页 > 编程语言 > Go语言

Poj 1459 Power Network 最大流

2014-04-10 23:05 501 查看
        Poj的1459题Power Network,很明显的最大流算法,只要添加一个源点S,一个汇点T即可。

       使用Edmonds_Karp算法可以很快的求出最大流。

       不过有一点需要注意,测试数据中容量C不累加,即C[i][j] += c是错误的。我在这里被坑了好久。

#include <iostream>
#include <string>
#include <queue>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

#define MAXNODE 1000
#define INF  999999
typedef int REAL;

REAL Capacity[MAXNODE][MAXNODE];
REAL Flow[MAXNODE][MAXNODE];
REAL MinFlow[MAXNODE];
int  Pre[MAXNODE];

int S, T;
int n;

REAL maxFlow()
{
REAL sumFlow = 0;

while(true)
{
memset(Pre, -1, sizeof(Pre));

queue<int>Q;
Q.push(S);

MinFlow[S] = INF;
Pre[S] = S;

while(!Q.empty())
{
int node = Q.front();
Q.pop();

//cout << "Visit node :" << node << endl;
if(node == T){
// cout << "break" << endl;
break;
}

for(int i = 0; i <= n; i++)
{
if(Pre[i] == -1 && Capacity[node][i] > Flow[node][i])
{
Pre[i] = node;
MinFlow[i] = MinFlow[node] < Capacity[node][i] - Flow[node][i] ? MinFlow[node] : Capacity[node][i] - Flow[node][i] ;

Q.push(i);
}
}
}

if(Pre[T] == -1)
break;

sumFlow +=  MinFlow[T];

int nowNode = T;
int preNode;
while(nowNode != S)
{
preNode = Pre[nowNode];

Flow[preNode][nowNode] += MinFlow[T];
Flow[nowNode][preNode] -= MinFlow[T];

nowNode = preNode;
}
}

return sumFlow;
}

int main()
{
//freopen("data.txt", "r", stdin);

int np, nc, e;

while(scanf("%d%d%d%d", &n, &np, &nc, &e) != EOF)
{
memset(Capacity, 0, sizeof(Capacity));
memset(Flow, 0, sizeof(Flow));
n++;
S = 0;
T = n;

int u, v;
REAL c;

while(e--)
{
while(getchar() != '(');

scanf("%d,%d)%d", &u, &v, &c);

//printf("%d %d --> %d\n", u,v,c);
Capacity[u+1][v+1] = c;
}

while(np--)
{
while(getchar() != '(');

scanf("%d)%d", &v, &c);

//printf("%d %d --> %d\n", u,v,c);
Capacity[S][v+1] = c;
}

while(nc--)
{
while(getchar() != '(');

scanf("%d)%d", &u, &c);

//printf("%d %d --> %d\n", u,v,c);
Capacity[u+1][T] = c;
}

cout << maxFlow() << endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algorithm network poj