您的位置:首页 > 其它

poj1273

2015-12-14 20:40 459 查看
题目很明显是网络流问题

使用Edmonds-Karp算法

每次对图进行bfs寻找增广路径 然后记录这个路径

flow[i][j] 从i到j的流量

capacity[i][j]为从i到j的最大的容量

每次找到增广路径后 将残余流量放在a[m]中

对整个路径上的点进行流量的更新

直到找不到增广路径

#include <iostream>
#include <queue>
using namespace std;
const int INF = 0XFFFFFF;
const int MAXSIZE = 200;
/*
flow[i][j]为当前流量 capacity[i][j]为容量 p[i]为路径中的前驱节点  a[i]为从s到i的路径中的网络残余量
*/
int flow[MAXSIZE][MAXSIZE], capacity[MAXSIZE][MAXSIZE], p[MAXSIZE], a[MAXSIZE];
int s, e,m;//s为开始点 e为终点 m为顶点的个数
int EdmondsKarp()
{
int sum = 0;
queue<int> q;
while (1)
{
memset(a, 0, sizeof(a));//每次进行bfs之前清空网络残余流量
a[s] = INF;
q.push(s);
while (!q.empty())
{
int u;
u = q.front();
q.pop();
for (int v = 1; v <= m; v++)
{
if (!a[v] && flow[u][v] < capacity[u][v])
{
p[v] = u;
a[v] = min(a[u], capacity[u][v] - flow[u][v]);
q.push(v);
}
}
}
if (a[m] == 0)//没有找到增广路径则退出循环
break;
sum += a[m];//加上本次的残余流量
for (int i = m; i != s; i = p[i])//更新flow[][]当前流量
{
flow[p[i]][i] += a[m];
flow[i][p[i]] -= a[m];
}
}

return sum;
}
int main(int argc,char**argv)
{
int n;//n为边的个数 m为点的个数
int u, v, w;
while (cin >> n >> m)
{
s = 1;
e = m;
memset(flow, 0, sizeof(flow));
memset(capacity, 0, sizeof(capacity));
for (int i = 0; i < n; i++)
{
cin >> u >> v >> w;
capacity[u][v] += w;
}
cout << EdmondsKarp() << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: