本文主要是介绍poj_1459_最大流,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述:
类似1087,基础最大流。化多源多汇点为单源单汇点。
解题思路:
标准的最大流题目。输入处理用sscanf。数组注意清空。
代码:
#include <stdio.h>
#include <stdlib.h>
#define N 103
#define MAX 1000000
int c[N][N], visit[N], pre[N], n, pn, cn, edge, max_flow, pre[N], visit[N];
void ford_fulkerson(int src, int des){
int x, y, tmp, min;
max_flow = 0;
while(edmonds_karp(src, des)==1){
min = MAX;
y = des;
x = pre[des];
while(y!=src){
if(c[x][y] < min)
min = c[x][y];
tmp = x;
x = pre[x];
y = tmp;
}
max_flow += min;
y = des;
x = pre[des];
while(y!=src){
c[x][y] -= min;
c[y][x] += min;
tmp = x;
x = pre[x];
y = tmp;
}
}
}
int edmonds_karp(int src, int des){
int front, rear, que[10000], v, i;
memset(visit,0,sizeof(visit));
front = rear = 0;
que[rear++] = src;
visit[src] = 1;
while(front != rear){
v = que[front++];
for(i=0;i<=des;i++){
if(!visit[i] && c[v][i]){
que[rear++] = i;
visit[i] = 1;
pre[i] = v;
if(i == des)
return 1;
}
}
}
return 0;
}
main()
{
int i, j, x, y, z;
char str[100], *p;
p = (char*)malloc(10*sizeof(char));
while(scanf("%d %d %d",&n, &pn, &cn)!=EOF){
memset(c,0,sizeof(c));
scanf("%d",&edge);
for(i=1;i<=edge;i++){
scanf("%s",str);
sscanf(str,"(%d,%d)%d",&x, &y, &z);
c[x][y] = z;
}
for(i=1;i<=pn;i++){
scanf("%s",str);
sscanf(str,"(%d)%d",&x, &y);
c[n][x] = y;
}
for(i=1;i<=cn;i++){
scanf("%s",str);
sscanf(str,"(%d)%d",&x, &y);
c[x][n+1] = y;
}
// for(i=0;i<=n+1;i++){
// for(j=0;j<=n+1;j++)
// printf("%d\t",c[i][j]);
// printf("\n");
// }
ford_fulkerson(n,n+1);
printf("%d\n",max_flow);
}
system("pause");
return 0;
}
这篇关于poj_1459_最大流的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!