oyjpArt ACM/ICPC算法程序设计空间

// I am new in programming, welcome to my blog
I am oyjpart(alpc12, 四城)
posts - 224, comments - 694, trackbacks - 0, articles - 6
遇到下面一个题目

给出一个有向图的各个点的in-degree和out-degree的时候 怎样求得这个图的边的情况?

答案是:
1.把所有的in-degree和所有的out-degree相加,如果不相等 则此图无法建成 输出impossible
2.如果可能建 立即得出边应该为 M = sum(in-degree) 因为每条边必然导致 indegree+1
3.对这个M条边做分配 如何分配呢? 如下方案可满足要求:
最大流算法

1.将每个点化成入点和出点(1分为2)
由于对于有向图中的边是从A的出点到B的入点 所以应该如下建图:
2.引出source从所有有向图中的点的出点的边 权为out-degree
3.引出所有有向图中的点的入点的边到sink的边 权为 in-degree
4.引出所有有向图任一点到另一点的边 权统一为1(在没有重边的题目要求下)
5.执行最大流算法 如果得到 M 的最大流 则满足题意 输出所有这些边
(如是从B点的出点到A的入点 则输出B->A)

Feedback

# re: 根据定点度数建图--最大流算法  回复  更多评论   

2007-04-16 18:48 by xrz
呵呵,四城的博客真是好东东

# re: 根据定点度数建图--最大流算法[未登录]  回复  更多评论   

2007-04-21 00:43 by AC
看得不是太懂,请问可以举个例子吗?

# re: 根据定点度数建图--最大流算法  回复  更多评论   

2007-04-21 10:09 by oyjpart
首先 我们相当于做一个简单测试(判线段相交的快速排斥实验的那种味道)我们把所有节点的入度和出度分别相加 如果入度和和出度和不相等 显然不满足图的要求(因为任意一条边必然产生一个入度和一个出度)。否则我们定义M = SUM(in-degree); 接下来的任务是对这M条边作点的分配。 如果考虑网络流的做法,由于每个点对应着2个权值 in-degree, out-degree,一种常规的做法是将一个点A分成2个点 我们称为A-in & A-out。然后我们建立一个source连接到所有的A-out点 再建立一个sink连接所有的A-in。这样我们就可以成功的把indegree和outdegree作为各自的容量。也就是从source到A-out的capacity定为A的out-degree,A-in到sink的capacity定为A的in-degree。为什么要这样建图呢?实际上作为任何一个可能存在的边 在我们的点一分为2之后 都应该是从A-out到B-in的这样一条边 所以我们这样建图之后 就可以对任一点的out到任一点的in连上一条capacity为1的边(无重边的题目描述)然后run一次最大流 如果能够正确得到M的最大流(实际上就会得到M条边) 这样就满足了题目要求了 呵呵 从整个过程来看 这个和二分图匹配是很像的 实际上 很多题目的网络流建图方案都与2分图匹配有着关联 ^_^

# re: 根据定点度数建图--最大流算法  回复  更多评论   

2007-05-30 23:30 by alpc62
好诡异的算法……

# re: 根据定点度数建图--最大流算法[未登录]  回复  更多评论   

2007-07-24 20:04 by 菜鸟
建立一个source连接到所有的A-out点 再建立一个sink连接所有的A-in。这样我们就可以成功的把indegree和outdegree作为各自的容量。也就是从source到A-out的capacity定为A的out-degree,A-in到sink的capacity定为A的in-degree。

source是什么,sink又是什么?看不懂哎,求解答。。。

# re: 根据定点度数建图--最大流算法  回复  更多评论   

2007-07-27 08:16 by oyjpart
是网络流中我们自己确定的2个特殊节点。
如果对网络流算法比较陌生 我觉得看一下相关书籍比较好 :)

# re: 根据定点度数建图--最大流算法  回复  更多评论   

2008-02-13 22:33 by wws
zan!

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理