我目前正在编写一个处理图形操作的程序。为简单起见,每个顶点的标签是正整数(即1,2,......)。对于我想要实现的算法之一,我需要编写一个函数edgeId(u, v)
,它接受两个顶点数u
和v
并将边(u,v)映射到a 唯一正整数。
由于我的算法必须处理有向和无向图,我有以下规定。对于有向图,edgeId(u, v)
必须是单射的(即edgeId(a, b)
= edgeId(c, d)
当且仅当a
= c
且b
= {{1} }})。对于无向图,它必须是对称的(即d
= edgeId(u, v)
,但只有那两个可以映射到该正整数。)
有没有人知道如何实现这样的功能?到目前为止,我所有的想法都失败了,因为我不知道图中的顶点数量。
非常感谢任何帮助!
答案 0 :(得分:1)
def undirectedEdgeId(u, v):
M = max(u, v)
m = min(u, v)
return M * (M - 1) / 2 + m
def directedEdgeId(u, v):
d = undirectedEdgeId(u, v)
if u < v:
return 2 * d
else:
return 2 * d - 1
可以使用表格显示undirectedEdgeId
的内容:
3 | 4 5 6
2 | 2 3 5
1 | 1 2 4
u -- -- --
v 1 2 3
或m
和M
3 | 6
2 | 3 5
1 | 1 2 4
m -- -- --
M 1 2 3
这些功能的好处是两者都可以很容易地反转。