poj 1273
Posted LMissher
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 1273相关的知识,希望对你有一定的参考价值。
题意:网络流的裸题,1为源点,n为汇点,给定每条边的容量,求最大流,用EK算法。
代码:
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#define N 300
#define INF 0x7fffffff
using namespace std;
int Map[N][N];
int path[N];
int n,m;
bool bfs(int s,int t){//寻找最短路径
int p;
queue<int> q;
memset(path,-1,sizeof(path));
path[s]=s;
q.push(s);
while(!q.empty()){
p=q.front();
q.pop();
for(int i=1;i<=m;i++){
if(Map[p][i]>0&&path[i]==-1){
path[i]=p;
if(i==t) return true;
q.push(i);
}
}
}
return false;
}
int Ek(int s,int t){
int d,flow=0;
while(bfs(s,t)){//直到无法找到最短路径
d=INF;
for(int i=t;i!=s;i=path[i]){
d=min(d,Map[path[i]][i]);
}
for(int i=t;i!=s;i=path[i]){
Map[path[i]][i]-=d;//正向
Map[i][path[i]]+=d;//反向
}
flow+=d;
}
return flow;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
memset(Map,0,sizeof(Map));
for(int i=1;i<=n;i++){
int from,to,flow;
scanf("%d%d%d",&from,&to,&flow);
Map[from][to]+=flow;
}
printf("%d\n",Ek(1,m));
}
return 0;
}
以上是关于poj 1273的主要内容,如果未能解决你的问题,请参考以下文章
poj 1273 Drainage Ditches(最大流)
POJ 1273 Drainage Ditches (网络最大流)