去除有向图中两节点间的环

简介:

问题描述:给出点及点间的关系,指定点为根节点,把有向图转化为树。其中,有向图中的环,只是两个节点之间。比如

   经过去掉环得到   

其中图的表示为:

复制代码
1->2
2->4
2->5
1->3
5->2
复制代码

解决之道
先用字典node_dic把整个图表示出来;列表has_kid存放不是叶子的节点;列表node_list是个队列,存放本节点和它的孩子;列表have_exist表示已经存在的节点,对于node_list如果不是孩子节点,又不在have_exist中,当被遍历是存于have_exist,同时在node_lst删除该节点。之后遍历node_list,如果之前已经存在于have_exist中了,则删除之间的关系。剩下的部分为无环图。

示例

node_dic: {1:[2, 3], 2:[4, 5], 5:[2]}

has_kid: [1, 2, 5]

指定根节点为1

 步骤

*)一开始node_list存放根节点:(注意node_list背景色为红色,have_eist为绿色)

此时:node_dic: {1:[2, 3], 2:[4, 5], 5:[2]}

**)看node_list的第一个节点,不在have_exist,又不是孩子节点,把它所有的孩子存于队列node_list,查看孩子是否在have_exist,要是在就删除node_dic中的关系。最后删除首节点

***)看node_list的第一个节点,不在have_exist,又不是孩子节点,把它所有的孩子存于队列node_list,查看孩子是否在have_exist,要是在就删除node_dic中的同时删除首节点。

 

****)看node_list的第一个节点4、5,是孩子节点,直接删除该节点

此时:node_dic: {1:[2, 3], 2:[4, 5], 5:[2]}

*****)看node_list的第一个节点,在have_exist,删除首节点,同时删除node_dice中的关系。

参考代码(python)

复制代码
node_relation = ['1->2', '2->4', '2->5', '5->2', '1->3']
root = '1'
node_dic = {}
have_kid = []
have_exist = []
node_list = []
for key in node_relation:
    chunk = key.split("->")
    if not chunk[0] in have_kid:
        have_kid.append(chunk[0])
    if not node_dic.has_key(chunk[0]):
        node_dic[chunk[0]] = []
        node_dic[chunk[0]].append(chunk[1])
    else:
        node_dic[chunk[0]].append(chunk[1])
node_list.append(root)
while len(node_list) != 0:
    rmtmp = []
    if not node_list[0] in have_kid:
        node_list.remove(node_list[0])
    else:
        for key in node_dic[node_list[0]]:
            node_list.append(key)
            if key in have_exist:
                rmtmp.append(key)
        if node_list[0] not in have_exist:
            have_exist.append(node_list[0])
        for keyy in rmtmp:
            node_dic[node_list[0]].remove(keyy)
        node_list.remove(node_list[0])
print node_dic
    
复制代码

结果:{'1': ['2', '3'], '2': ['4'], '5': []}






本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3141350.html,如需转载请自行联系原作者


相关文章
|
IDE 开发工具 Python
在pycharm中使用jupyter
本文介绍了如何在PyCharm中安装并使用Jupyter Notebook,包括在PyCharm中新建Jupyter Notebook、配置Jupyter Server以及利用PyCharm的高级功能进行更高效的编程和调试。
在pycharm中使用jupyter
|
机器学习/深度学习 算法 关系型数据库
【PyTorch深度强化学习】DDPG算法的讲解及实战(超详细 附源码)
【PyTorch深度强化学习】DDPG算法的讲解及实战(超详细 附源码)
5898 1
|
IDE 开发工具 Android开发
推荐两个高逼格Pycharm主题Material Theme UI、One Dark theme
推荐两个高逼格Pycharm主题Material Theme UI、One Dark theme
6138 0
|
25天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
34595 136
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
7天前
|
人工智能 自然语言处理 监控
OpenClaw skills重构量化交易逻辑:部署+AI全自动炒股指南(2026终极版)
2026年,AI Agent领域最震撼的突破来自OpenClaw(原Clawdbot)——这个能自主规划、执行任务的智能体,用50美元启动资金创造了48小时滚雪球至2980美元的奇迹,收益率高达5860%。其核心逻辑堪称教科书级:每10分钟扫描Polymarket近千个预测市场,借助Claude API深度推理,交叉验证NOAA天气数据、体育伤病报告、加密货币链上情绪等多维度信息,捕捉8%以上的定价偏差,再通过凯利准则将单仓位严格控制在总资金6%以内,实现低风险高频套利。
3339 20
|
20天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
7578 22
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
19天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
5241 12

热门文章

最新文章