博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1273 Drainage Ditches 基础网络流
阅读量:4509 次
发布时间:2019-06-08

本文共 2078 字,大约阅读时间需要 6 分钟。

1 #include 
2 #include
3 using namespace std; 4 int G[300][300]; 5 int Prev[300]; //路径上每个节点的前驱节点 6 bool Visited[300]; 7 int n,m; //m是顶点数目,顶点编号从1开始 1是源,m是汇, n是 边数 8 9 int Augment()10 { 11 int v;12 int i;13 deque
q;14 memset(Prev,0,sizeof(Prev));15 memset(Visited,0,sizeof(Visited));16 Prev[1] = 0;17 Visited[1] = 1;18 q.push_back(1);19 bool bFindPath = false;20 //用bfs寻找一条源到汇的可行路径 21 while (!q.empty())22 {23 v = q.front();24 q.pop_front();25 for (i = 1; i <= m; i++)26 {27 if (G[v][i] > 0 && Visited[i] == 0)28 { 29 //必须是依然有容量的边,才可以走30 Prev[i] = v;31 Visited[i] = 1;32 if( i == m )33 {34 bFindPath = true;35 q.clear();36 break;37 }38 else 39 q.push_back(i);40 } 41 }42 } 43 44 if (!bFindPath)45 return 0;46 int nMinFlow = 999999999;47 v = m; //寻找源到汇路径上容量最小的边,其容量就是此次增 加的总流量48 while( Prev[v] )49 { 50 nMinFlow = min( nMinFlow,G[Prev[v]][v]); 51 v = Prev[v];52 } 53 //沿此路径添加反向边,同时修改路径上每条边的容量54 v = m; 55 while( Prev[v] )56 { 57 G[Prev[v]][v] -= nMinFlow;58 G[v][Prev[v]] += nMinFlow; 59 v = Prev[v];60 } 61 return nMinFlow;62 } 63 64 int main() 65 {66 while (cin >> n >> m) 67 { 68 //m是顶点数目,顶点编号从1开始69 int i,j,k;70 int s,e,c;71 memset( G,0,sizeof(G));72 for( i = 0;i < n;i ++ )73 { 74 cin >> s >> e >> c; 75 G[s][e] += c; //两点之间可能有多条边76 } 77 int MaxFlow = 0; 78 int aug; 79 while( aug = Augment() )80 MaxFlow += aug; 81 cout << MaxFlow << endl; 82 } 83 return 0; 84 }

 

转载于:https://www.cnblogs.com/ouyang_wsgwz/p/7225108.html

你可能感兴趣的文章
JVMGC机制
查看>>
IAR for AVR 报array is too large错误 【已解决】
查看>>
老子《道德经》第六十二章
查看>>
Junit问题01 利用 @Autowired 注入失效问题
查看>>
20180711
查看>>
Js常见的创建对象
查看>>
IOS拖动
查看>>
httpclient的使用
查看>>
Kafka集群副本分配算法解析
查看>>
vue单页面条件下添加类似浏览器的标签页切换功能
查看>>
lambda表达式10个示例——学习笔记
查看>>
python 文件操作
查看>>
Java多线程之后台线程
查看>>
浏览器兼容性
查看>>
非均衡分类问题的思考与问题与解决思路
查看>>
头文件与extern
查看>>
python开发技术详解(三) 进阶的语法
查看>>
LeetCode Missing Number
查看>>
Linux 网络(连接)相关参数作用
查看>>
鼠标事件先后顺序
查看>>