编写函数将边缘映射到正整数

时间:2014-12-04 11:56:08

标签: algorithm function

我目前正在编写一个处理图形操作的程序。为简单起见,每个顶点的标签是正整数(即1,2,......)。对于我想要实现的算法之一,我需要编写一个函数edgeId(u, v),它接受​​两个顶点数uv并将边(u,v)映射到a 唯一正整数。

由于我的算法必须处理有向和无向图,我有以下规定。对于有向图,edgeId(u, v)必须是单射的(即edgeId(a, b) = edgeId(c, d)当且仅当a = cb = {{1} }})。对于无向图,它必须是对称的(即d = edgeId(u, v),但只有那两个可以映射到该正整数。)

有没有人知道如何实现这样的功能?到目前为止,我所有的想法都失败了,因为我不知道图中的顶点数量。

非常感谢任何帮助!

1 个答案:

答案 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 

mM

3 |       6
2 |    3  5
1 | 1  2  4
m  -- -- --
  M 1  2  3 

这些功能的好处是两者都可以很容易地反转。