通过有向边关系得到每个图包含的节点信息

实现将多个有序的关系对聚合层多个类,实质为由多个有向边的关系对得到图的个数。

示例:

如现有如下有向关系对:

(A,B),(B,C),(D,C),(E,F),(G,F),(H,E),(I-G),(J-B)

其中,(A,B)表示A属于B,即为有向关系对。

通过关系合并,则最终可以得到的两个图(类)。图1的节点有(A,B,C,D,J)、图2的节点有(E,F,G,I)。

代码实现:

def _find_parent(parent, u):
    idx = []
    # parent is a fixed point
    while (u != parent[u]):
        idx.append(u)
        u = parent[u]
    for i in idx:
        parent[i] = u
    return u


def edge_to_connected_graph(edges, num):
    """
    :param edges: 有向关系对
    :param num: 定点个数
    :return: 
    """
    parent = list(range(num))
    for u, v in edges:
        p_u = _find_parent(parent, u)
        p_v = _find_parent(parent, v)
        parent[p_u] = p_v

    for i in range(num):
        parent[i] = _find_parent(parent, i)
    remap = {}
    uf = np.unique(np.array(parent))
    for i, f in enumerate(uf):
        remap[f] = i
    cluster_id = np.array([remap[f] for f in parent])
    return cluster_id

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值