您的位置:首页 > 理论基础 > 计算机网络

网络流入门----pku1273

2009-05-07 16:43 225 查看
#include<iostream>

#include<queue>

using namespace std;

#define MAX_N 205

#define MAX_M 205

const int INF=0x7fffffff;

int map[MAX_M][MAX_M],pre[MAX_M];

//int flow[MAX_M];

int s,e,c,n,m;

int bfs();

int EDmonds_Karp();

int main()

{

while(scanf("%d%d",&n,&m)!=EOF){

memset(map,0,sizeof(map));

while(n--){

scanf("%d %d %d",&s,&e,&c);

map[s][e]+=c;

}

s=1;e=m;

printf("%d\n",EDmonds_Karp());

}

return 0;

}

int EDmonds_Karp()

{

int max_flow=0,cur,min;

while((min=bfs())!=-1){ //找增广路径,找到,则构造残余网络

max_flow+=min;

for(cur=e;cur!=s;cur=pre[cur]){

map[pre[cur]][cur]-=min; //更新正向边的实际流量

map[cur][pre[cur]]+=min; //添加反向边

}

}

return max_flow;

}

int bfs()

{

int i,tmp,min;

queue<int>q; //保存优先扩展出来的顶点的队列

// while(!q.empty()) q.pop();

memset(pre,-1,sizeof(pre)); //pre数组存储当前已访问过结点的增广路径

pre[s]=0;

// flow[s]=INF; //flow数组存储一次BFS遍历之后流的可改进量

q.push(s);

while(!q.empty()){

tmp=q.front();q.pop();

if(tmp==e) { //增广路径找到

// break;

min=INF;

for(i=e;i!=s;i=pre[i])

min=map[pre[i]][i]<min?map[pre[i]][i]:min;

return min;

}

for(i=1;i<=e;i++){

if(i!=s&&pre[i]==-1&&map[tmp][i]){ //检测到一个顶点未访问且允许流量增加

// flow[i]=flow[tmp]<map[tmp][i]?flow[tmp]:map[tmp][i];

q.push(i);

pre[i]=tmp;

}

}

}

return -1;

// if(pre[e]==-1) return -1;

// return flow[e];

}
题目地址:http://acm.pku.edu.cn/JudgeOnline/problem?id=1273
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: