首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

问个比较难得有关问题

2012-03-05 
问个比较难得问题一个n个顶点的图中有2种类型的边,选择固定数量的不同类型的边(如5个顶点中有5个红边5个滥

问个比较难得问题
一个n个顶点的图中有2种类型的边,选择固定数量的不同类型的边(如5个顶点中有5个红边5个滥边,要选择2个红边,2个兰边),这些边(总共n-1个)能否组成一个生成树?有什么算法能够找出是否存在这些边组成的树。 用穷举法太慢了。谢谢/


[解决办法]
设:原来n个顶点的图为G(n),要找图G(n)的m1条红边和m2条蓝边组成的生成树T(G(n),m1,m2)。

假设从n个顶点中删除一个非关节点(关节点也称为割点)p(n)以及p(n)相关联的边,记剩下的n-1个顶点的图为G(n-1)。

由于p(n)是非关节点,因此G(n-1)必然是连通的,因此图G(n-1)必然有生成树。

现在,考虑删除的与p(n)相关联的边集合E(n)。
显然,E(n)有三类:
1):E(n)中所有边的颜色是红
2):E(n)中所有边的颜色是蓝
3):E(n)中的边,有红有蓝

如果E(n)是(1)类,那么我们只需要在图G(n-1)找到T(G(n-1),m1-1,m2),然后,从E(n)中任选一条边ei,将ei与
T(G(n-1),m1-1,m2)组合,就得到了T(G(n),m1,m2)。记这样的p(n)为1类点。

同理,如果E(n)是(2)类,那么我们只需要在图G(n-1)找到T(G(n-1),m1,m2-1),然后,从E(n)中任选一条边ej,将ej与T(G(n-1),m1,m2-1)组合,就得到了T(G(n),m1,m2)。记这样的p(n)为2类点。

E(n)是(3),那么,我们处理起来就更方便了,因为它很“随便”:只要能找到图G(n-1)的T(G(n-1),m1-1,m2)和
T(G(n-1),m1,m2-1)中的任意一个生成树,我们就可以仿照上面的方法得到T(G(n),m1,m2)。记这样的p(n)为3类点。

对于E(n)中的边有红有蓝的情况,我们暂时不处理。


现在,再对G(n-1)进行相似的处理,再对G(n-2)进行相似的处理,... 
假设处理到图G(W)时,发现G(W)中的所有边的颜色只有一种,这时,我们就没有了颜色的限制了(因为边只有一种颜色了),因此只要找到G(W)的任一生成树就可以了。

现在,再来看最后如何构造满足条件的生成树。

设总共有R个1类点被标记,B个2类点被标记,S个3类点被标记,并且在处理到图G(W)时,发现G(W)中的所有边的颜色只有一种。不妨设颜色为红,那么,显然图G(W)中有W-1条红边。

现在,生成树T(G(n),m1,m2)中,不确定的部分只剩下:3类点的颜色的具体分配。

设S个3类点中,有S1个红顶点,S2个蓝顶点。

那么,显然,有:
S1+R+W-1=m1 (1)
S2+B=m2 (2)

现在,我们只要按照上面的两个约束条件,对3类点进行颜色分配。
分配之后,T(G(n),m1,m2)的所有部分就全部确定了。

最后,算法过程的几点解释:
1):找一个图的非关节点,只需要找其DFS树的叶子。
2):对3类点进行颜色分配时,只要满足约束条件即可,这可以用贪心法来做。

[解决办法]
一条路 v1,v2,....vn ,n-1条边全为red边
添加v0以及 所有边(v0,vi),当i为奇数,red;当i为偶数,blue
设n=10 求T(G(11),5,5),
显然v0不是隔点,且以v0为中心的星满足要求。
如果算法选择的第一个点为v0,则剩下的{v1,...vn}对于求T(G(10),4,5),T(G(10),5,4)均无解

热点排行