您的位置:首页 > 其它

POJ 1273

2013-07-04 00:42 204 查看
最大流基础题。基本的思路是:先找增广路,路上的流量减掉,反流量(名字忘记了)加上,直到找不到增广路。

#include <cstdio>
#include <cstring>
#include <queue>
#include <climits>

using std::queue;
using std::memset;

const int MAX = 400;
int flow[MAX][MAX];
int father[MAX];
bool visit[MAX];
int n,m;

int ford_fulkerson()
{
int ans = 0;
queue<int> q;

while(1)
{
while(!q.empty()) q.pop();

q.push(1);

memset(visit, 0, sizeof(visit));
memset(father, 0, sizeof(father));

while(!q.empty())
{
int from = q.front();
q.pop();

if(from == n)
break;

for(int to = 1 ; to <= n; to++)
{
if(flow[from][to] && !visit[to])
{
father[to] = from;
q.push(to);
visit[to] = true;
}
}
}

if(!visit
)
return ans;

int minflow = INT_MAX;
for(int to = n; to != 1; to = father[to])
{
int from = father[to];
if(minflow > flow[from][to])
minflow = flow[from][to];
}

for(int to = n; to != 1; to = father[to])
{
int from = father[to];
flow[from][to] -= minflow;
flow[to][from] += minflow;
}
ans += minflow;
}
}

int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(flow, 0, sizeof(flow));

for(int i = 0 ; i < m; i++)
{
int from, to, val;
scanf("%d%d%d",&from, &to, &val);
flow[from][to] += val;
}
printf("%d\n", ford_fulkerson());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: