poj 1459 最大流
2013-12-04 19:25
288 查看
#include "stdio.h" //poj 1459 最大流 #include "string.h" #include "queue" using namespace std; #define N 205 #define INF 0x3fffffff int n; bool mark; int map ,maxf ,route ; int EK(); int BFS(); void init(); int MIN(int x,int y); int main() { int i,j; char ch; int m,np,nc; int u,v,w; while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=-1) { init(); while(m--) { scanf(" (%d,%d)%d",&u,&v,&w); if(u==v) continue; map[u+1][v+1] += w; } int start = 0; //超级源点 while(np--) { scanf(" (%d)%d",&v,&w); map[start][v+1] += w; } int end = n+1; //超级汇点 while(nc--) { scanf(" (%d)%d",&u,&w); map[u+1][end] += w; } int ans = EK(); printf("%d\n",ans); } return 0; } void init(){ memset(map,0,sizeof(map)); } int MIN(int x,int y) { return x<y?x:y; } int EK() { int ans=0,kejia; int x,y; while(kejia = BFS()) { ans += kejia; y = n+1; while(y!=0) { x = route[y]; map[x][y]-=kejia; map[y][x]+=kejia; y = x; } } return ans; } int BFS() { int i; int x,y; memset(route,-1,sizeof(route)); for(i=0;i<N;i++) maxf[i] = INF; queue<int> q; route[0] = 0; q.push(0); while(!q.empty()) { x = q.front(); q.pop(); for(y=0;y<=n+1;y++) { if(route[y]==-1 && map[x][y]!=0) { maxf[y] = MIN(maxf[x],map[x][y]); route[y] = x; q.push(y); } } } if(route[n+1]==-1) return 0; return maxf[n+1]; }
相关文章推荐
- 动易2006序列号破解算法公布
- C#数据结构与算法揭秘二
- 浅析STL中的常用算法
- JavaScript 组件之旅(二)编码实现和算法
- 将15位身份证补全为18位身份证的算法示例详解
- C++算法系列之日历生成的算法代码
- 1 2 3 4 5 6 7 8 9 = 110的java实现
- Sedgewick之巨著《算法》,与高德纳TAOCP一脉相承
- 【代码】Pythonの代码片段
- STL中算法
- 数据结构&算法学习
- 算法的时间复杂度
- 算法导论:选择排序的原理与实现
- PHP实现四种常用的排序算法
- 图解插入排序算法
- 一些常见算法的JavaScript实现
- 平方根sqrt()函数的底层算法效率
- 二叉搜索树的一些相关算法介绍
- 欧几里德算法(辗转相处法)练手
- 面试中常见的一些算法问题