Maximum flow problem

sunner008 2010-06-22 09:22:59
void findpath()
{
visit[s]=1;reached=0;
for (v ∈ V-{s})
visit[v]=0;
for (v ∈ V)
d[v]=INFINITY;
create(&q);insert(&q,s);
do {
v=top(&q);delete(&q);
for (w ∈ adjlist[v]){
if (!visit[w] && f[v][w]<c[v][w]){
visit[w]=1;
insert(&q,w);
p[w]=v;
d[w]=min(d[v],c[v][w]-f[v][w]);
if (w==t)
reached=1;
}
}
} while (!empty(&q) && !reached);
}

void augment()
{
v=t;
if (reached)
do {
f[p[v]][v]+=d[t];
f[v][p[v]]-=d[t];
v=p[v];
} while (v!=s);
}

main()
{
do {
findpath();
augment();
} while (!empty(&q));
}


利用广度优先探索实现最大流量的问题,但是这个算法不明白的地方太多。
这个是对Flow network的探索。
1、if (!visit[w] && f[v][w]<c[v][w])的 f[v][w]<c[v][w]是不是根据augmenting path的定义,因为在边v(i),v(i+1)时f(e)<c(e)的关系呢?是不是因为在Flow network探索的时候f(e)=0所以每条边f(e)<c(e)的呢?
2、if (w==t) reached=1;这部语句是实现什么的?
3、while (!empty(&q) && !reached)的!reached的作用是否是reached为0语句为真的意思呢?
4、augment函数是实现augmenting path流量更新的,但是具体的语句是怎么实现的呢?
十分感谢高手来解答,这个问题困惑了我很长时间。
...全文
87 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanshuai888 2010-06-23
  • 打赏
  • 举报
回复
void findpath()
{
visit[s]=1;reached=0;/*sを訪れた、sからtに路が見つかっていないので、reached=0*/
for (v ∈ V-{s})
visit[v]=0;/*sの次のノードがvであり、訪れていないので、0に設定する*/
for (v ∈ V)
d[v]=INFINITY;/*最初状態で訪れていないので、無限を設定する*/
create(&q);insert(&q,s);/*この行目から幅優先探索を行う*/
do {
v=top(&q);delete(&q);
for (w ∈ adjlist[v]){
if (!visit[w] && f[v][w]<c[v][w]){/*増分路の概念2の1によってf[v][w]<c[v][w]、だから、増分路しか辿らない*/
visit[w]=1;
insert(&q,w);/*幅優先探索のノードのマーク、*/
p[w]=v;
d[w]=min(d[v],c[v][w]-f[v][w]);/*Pの辺の残余容量の最小値をd[w]に設定しておく*/
if (w==t)
reached=1;/*終点に訪れる、増分路が存在するので、reached=1*/
}
}
} while (!empty(&q) && !reached);/*!empty(&q)は訪れ終わる、!reachedは増分路が存在しない*/
}

void augment()
{
v=t;/*終わるときに残余グラフにより、逆方向にフローを増加させる*/
if (reached)
do {
f[p[v]][v]+=d[t];/*d[t]増加させる最小値、概念二1によって、辺でフローを増加させる*/
f[v][p[v]]-=d[t];/*概念二2によって、辺でフローを増加させる*/
v=p[v];/*戻る路をvに付ける*/
} while (v!=s);/*出発点に辿るので、終わる*/
}

main()
{
do {
findpath();
augment();
} while (!empty(&q));/*繰り返し新たな増分路を探し、フローを増加させる*/
}
sunner008 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wobelisk 的回复:]
算法的基本思路就是广度优先搜索 residual network 上的可增路 augmenting path, 即从 s 到 t, 所有 residual = c - f > 0 的路径. 如果有, 就用该条路经上最小的 residual d 来修正 flow f. 直到没有可行path.
1. f < c, residual > 0, 是augmenting path的定义
2. w == ……
[/Quote]
太谢谢您了,但是我还有地方不是很明白。
1、p[w]=v;
d[w]=min(d[v],c[v][w]-f[v][w]);
语句的作用在于什么?d[v]=INFINITY;在上面把d[v]定义为无限,由于是无限在执行min的时候会总是取到c[v][w]-f[v][w]那这个min的意义在于什么呢?
2、f[p[v]][v]+=d[t];
f[v][p[v]]-=d[t];
v=p[v];
这三条语句具体实现的过程可否帮我举出例子呢?
十分感谢。

wobelisk 2010-06-22
  • 打赏
  • 举报
回复
算法的基本思路就是广度优先搜索 residual network 上的可增路 augmenting path, 即从 s 到 t, 所有 residual = c - f > 0 的路径. 如果有, 就用该条路经上最小的 residual d 来修正 flow f. 直到没有可行path.
1. f < c, residual > 0, 是augmenting path的定义
2. w == t, 说明可达终点.
3. while loop: 直到找到一条augmenting path, 或者不存在augmenting path.
4. augmenting path上最小的 residual d 加到路径上的每一边.

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧