78、无向图、有向图、序列相互转化

#有向图转无向图
def Directed_to_undirected(A):
    return [[1 if A[i][j] == 1 or A[j][i] == 1 else 0 for j in range(len(A[i]))] for i in range(len(A))]

#有向图转序列
def Directed_to_sequence(A):
    return Undirected_to_sequence(Directed_to_undirected(A))

#序列转有向图,默认LX中的ID是从0开始连续增加的
def Sequence_to_directed(LX):
    edges = set()
    for X in LX:
        for i in range(len(X)-1):
            edges.add((X[i], X[i+1]))
        #首尾不想等则加入该边
        if X[0] != X[-1]:
            edges.add((X[-1], X[0]))

    n = max([max(X) for X in LX])+1
    return [[1 if (i, j) in edges else 0 for j in range(n)] for i in range(n)]

#序列转无向图
def Sequence_to_undirected(LX):
    return Directed_to_undirected(Sequence_to_directed(LX))

#无向图转序列
def Undirected_to_sequence(A):
    edges = {i: set() for i in range(len(A))}
    for i in range(len(A)):
        for j in range(i + 1, len(A)):
            if A[i][j] == 1:
                edges[i].add(j)
                edges[j].add(i)

    #找起点
    items = [[k, len(v)] for k, v in edges.items()]
    items.sort(key=lambda x:x[1], reverse=True)
    p0 = items[0][0]

    LX = []
    while len(edges) > 0:
        X = [p0]
        now = p0
        while now in edges and len(edges[now]) > 0:
            next = edges[now].pop()
            if len(edges[now]) == 0:
                del edges[now]
            edges[next].remove(now)
            if len(edges[next]) == 0:
                del edges[next]
            if next == p0:
                break
            X.append(next)
            now = next
        LX.append(X)

    return LX

#无向图转有向图
def Unirected_to_directed(A):
    return Sequence_to_directed(Undirected_to_sequence(A))

if __name__ == '__main__':
    LX = [[0, 1, 2], [0, 3, 5], [0, 4]]
    A_undir = Sequence_to_undirected(LX)
    LX1 = Undirected_to_sequence(A_undir)
    print(LX1)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设我们有一个无向图 $G=(V,E)$,我们要证明如何将求解其哈密顿回路问题规约到有向图的哈密顿回路问题。 首先,我们可以将无向图 G 转化有向图 $G'=(V,E')$。对于无向图 G 中的每个边 $(u,v)$,我们可以将其替换为两条有向边 $(u,v)$ 和 $(v,u)$,即 $E' = \{(u,v),(v,u) \mid (u,v) \in E\}$。这样得到的有向图 G' 中,对于每个顶点 v,它的入度和出度都是 2. 接下来,我们将有向图 $G'=(V,E')$ 转化有向图 $G''=(V',E'')$。对于每个顶点 v,我们在 G'' 中添加两个新的顶点 $v_{in}$ 和 $v_{out}$,并将原来指向 v 的边 $(u,v)$ 改为从 $u_{out}$ 指向 $v_{in}$,将原来从 v 出发的边 $(v,w)$ 改为从 $v_{out}$ 指向 $w_{in}$。即 $E''=\{(u_{out},v_{in}),(v_{out},w_{in}) \mid (u,v),(v,w) \in E'\}$。 对于每个顶点 v,我们可以看做是一个入度为 1,出度为 1 的点,即 $v_{in}$ 的出度为 1,$v_{out}$ 的入度为 1,这样得到的有向图 G'' 中,对于每个顶点 v,它的入度和出度都是 1. 现在我们考虑如何找到有向图 G'' 的哈密顿回路。我们可以使用 Bellman-Ford 算法来检测是否存在负权环。如果存在负权环,则 G'' 中不存在哈密顿回路。否则,我们可以使用拓扑排序来找到 G'' 的拓扑序列。由于 G'' 中每个顶点的入度和出度都是 1,因此拓扑序列中只有一条路径可以穿过每个顶点。我们可以将该路径沿用到原图 G 中,即得到了 G 的哈密顿回路。 总之,我们可以通过上述转化无向图的哈密顿回路问题规约到有向图的哈密顿回路问题,因此无向图的哈密顿回路问题多项式时间规约到有向图的哈密顿回路问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值