某种带权有向无环图(graph)的所有路径的求法
// 讨论QQ群:135202158
最近做某个东西,最后用图实现了,这里总结一下算法。
假设有以下带权有向无环图(连通或非连通,我这里用的是非连通的):
每个节点(node)可能与其他节点有向地相连,相邻节点的边(edge)有权值(weight)属性。从一个节点到任意一个节点的连的集合称为路径(path),且路径的权为各边权的最小值。
现在的问题就是求所有可能的路径,并算出各路径的权。
以下是简单的C++代码实现,我是用遍历边来实现的,节点和边是两个数据结构:
#include <iostream>
#include <vector>
#include <list> using namespace std; // 节点
struct node
{
char val; node(char c) : val(c) {}
}; // 边
struct edge
{
// a->b,w为权
node a;
node b;
int w; edge(node& _a, node& _b, int _w) : a(_a), b(_b), w(_w) {}
}; // 遍历各边时所有的记录
struct record
{
list<node> path; // 路径上的节点列表
list<int> ws; // 当前的最小权列表
}; // 生成上图所示带权有向无环图
void gen_samples(vector<node>& nodes, vector<edge>& edges); // 递归遍历
void travel_path(vector<edge>& edges, edge& x, record& r)
{
size_t i;
for(i=; i<edges.size(); ++i)
{
edge e = edges[i];
// 判断是否连通
if(x.b.val == edges[i].a.val)
{
r.path.push_back(edges[i].b);
int w = min(x.w, edges[i].w);
r.ws.push_back(w);
travel_path(edges, edges[i], r);
}
} // 不与任何节点有向连通,输出路径,并回溯至上个节点
if(i == edges.size())
{
for(list<node>::iterator it = r.path.begin();
it != r.path.end(); ++it)
cout << it->val << " ";
cout << ", " << r.ws.back() << endl; r.path.pop_back();
r.ws.pop_back();
}
} int main()
{
vector<node> nodes;
vector<edge> edges; gen_samples(nodes, edges); for(size_t i=; i<edges.size(); ++i)
{
record r;
r.path.push_back(edges[i].a);
r.path.push_back(edges[i].b);
r.ws.push_back(edges[i].w); travel_path(edges, edges[i], r);
} system("PAUSE");
return ;
} void gen_samples(vector<node>& nodes, vector<edge>& edges)
{
node a('A'); nodes.push_back(a);
node b('B'); nodes.push_back(b);
node c('C'); nodes.push_back(c);
node d('D'); nodes.push_back(d);
node e('E'); nodes.push_back(e);
node f('F'); nodes.push_back(f);
node g('G'); nodes.push_back(g);
node h('H'); nodes.push_back(h);
node i('I'); nodes.push_back(i);
node j('J'); nodes.push_back(j);
node k('K'); nodes.push_back(k); edge e1(a, c, ); edges.push_back(e1);
edge e2(b, d, ); edges.push_back(e2);
edge e3(b, e, ); edges.push_back(e3);
edge e4(c, f, ); edges.push_back(e4);
edge e5(c, h, ); edges.push_back(e5);
edge e6(e, h, ); edges.push_back(e6);
edge e7(g, i, ); edges.push_back(e7);
edge e8(g, j, ); edges.push_back(e8);
edge e9(h, k, ); edges.push_back(e9);
}
执行结果为(逗号前面是沿路径的各节点,后面的数字是路径的权):
A C F , 4
A C H K , 1
A C H , 1
A C , 5
B D , 2
B E H K , 3
B E H , 5
B E , 7
C F , 4
C H K , 1
C H , 1
E H K , 3
E H , 5
G I , 2
G J , 8
H K , 3
出来的结果是所有可能的路径,如果要找包含某节点的最长路径的话,这个是有冗余的,需要去一下。
某种带权有向无环图(graph)的所有路径的求法的更多相关文章
- 图->有向无环图->求关键路径
文字描述 与AOV-网相对应的是AOE-网(Activity on Edge)即边表示活动的网.AOE-网是一个带权的有向无环图.其中,顶点表示事件Event,弧表示活动,权表示活动持续的时间.通常, ...
- javascript实现有向无环图中任意两点最短路径的dijistra算法
有向无环图 一个无环的有向图称做有向无环图(directed acycline praph).简称DAG 图.DAG 图是一类较有向树更一般的特殊有向图, dijistra算法 摘自 http://w ...
- 算法精解:DAG有向无环图
DAG是公认的下一代区块链的标志.本文从算法基础去研究分析DAG算法,以及它是如何运用到区块链中,解决了当前区块链的哪些问题. 关键字:DAG,有向无环图,算法,背包,深度优先搜索,栈,BlockCh ...
- [转帖]MerkleDAG全面解析 一文读懂什么是默克尔有向无环图
MerkleDAG全面解析 一文读懂什么是默克尔有向无环图 2018-08-16 15:58区块链/技术 MerkleDAG作为IPFS的核心数据结构,它融合了Merkle Tree和DAG的优点,今 ...
- HOJ 13845 Atomic Computer有向无环图的动态规划
考虑任意一个数字,任何一个都会有奇怪的..性质,就是一个可以保证不重复的方案——直接简单粗暴的最高位加数字..于是,如同上面的那个题:+1.-1.0 但是考虑到65536KB的标准内存限制,会得出一个 ...
- UVA_1025 a Spy in the Metro 有向无环图的动态规划问题
应当认为,有向无环图上的动态规划问题是动态规划的基本模型之一,对于某个模型,如果可以转换为某一有向无环图的最长.最短路径问题,则可以套用动态规划若干方法解决. 原题参见刘汝佳紫薯267页. 在这个题目 ...
- 【学习笔记】有向无环图上的DP
手动博客搬家: 本文发表于20180716 10:49:04, 原地址https://blog.csdn.net/suncongbo/article/details/81061378 首先,感谢以下几 ...
- [转帖]算法精解:DAG有向无环图
算法精解:DAG有向无环图 https://www.cnblogs.com/Evsward/p/dag.html DAG是公认的下一代区块链的标志.本文从算法基础去研究分析DAG算法,以及它是如何运用 ...
- DAG(有向无环图)技术
什么是DAG? DAG的全称为"Directed Acyclic Graph",中文意思为:有向无环图,它由有限个顶点和"有向边"组成,从任意顶点出发,经过若干 ...
随机推荐
- leetcode 14 最长公共前缀
描述: 给个字符串vector,求最长公共前缀. 解决: 直接取第一个字符串作为最长公共前缀,将其每个字符遍历过一次.设最长字符实际为k,共n个元素,则复杂度O(nk) string longestC ...
- Eclipse自动补全修改
一.前言 之前敲代码用的是文本工具sublime,转到Eclipse之后发现补全功能特别不方便,所以想根据自己的情况进行调整,具体有两点: 输入某些语句的前几个字母就能自动提示相关的完整语句 用tab ...
- SNAT和DNAT的区别
SNAT: Source Network Address Translation,是修改网络包源ip地址的.DNAT: Destination Network Address Translation, ...
- spring框架 构造方法注入
在resources里面新建applicationContext.xml 配置如下: <?xml version="1.0" encoding="UTF-8&quo ...
- Python爬虫进阶三之Scrapy框架安装配置
初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此整理如下. Windows 平台: 我的系统是 ...
- 关于流程图设计,你需要Get的几点必备知识
流程图(Flow Chart)这个概念对很多人来说并不陌生,但如果让你定义或者举例说明什么是产品流程图,恐怕还是有难度的.或许诸如“用户体验”.“交互设计”.“逻辑关系”等词会像走马灯般闪现在你的脑海 ...
- android 的AlertDialog对话框
private int selectedFruitIndex = 0; private void showMsg2() {// Dialog alertDialog = new AlertDial ...
- Spring boot——logback.xml 配置详解(四)<filter>
阅读目录 1 filter的使用 2 常用的过滤器 文章转载自:http://aub.iteye.com/blog/1101260,在此对作者的辛苦表示感谢! 回到顶部 1 filter的使用 < ...
- centos环境下登录mysql报 ERROR 1045 (28000)怎么解决
centos环境下登录mysql报 ERROR 1045 (28000)怎么解决 新入手一台虚拟机,Centos7系列的操作系统,安装mysql后,执行连接出现了Mysql ERROR 1045 (2 ...
- 给力分享新的ORM => Dapper( 转)
出处:http://www.cnblogs.com/sunjie9606/archive/2011/09/16/2178897.html 最近一直很痛苦,想选一个好点的ORM来做项目,实在没遇到好的. ...