// 讨论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)的所有路径的求法的更多相关文章

  1. 图->有向无环图->求关键路径

    文字描述 与AOV-网相对应的是AOE-网(Activity on Edge)即边表示活动的网.AOE-网是一个带权的有向无环图.其中,顶点表示事件Event,弧表示活动,权表示活动持续的时间.通常, ...

  2. javascript实现有向无环图中任意两点最短路径的dijistra算法

    有向无环图 一个无环的有向图称做有向无环图(directed acycline praph).简称DAG 图.DAG 图是一类较有向树更一般的特殊有向图, dijistra算法 摘自 http://w ...

  3. 算法精解:DAG有向无环图

    DAG是公认的下一代区块链的标志.本文从算法基础去研究分析DAG算法,以及它是如何运用到区块链中,解决了当前区块链的哪些问题. 关键字:DAG,有向无环图,算法,背包,深度优先搜索,栈,BlockCh ...

  4. [转帖]MerkleDAG全面解析 一文读懂什么是默克尔有向无环图

    MerkleDAG全面解析 一文读懂什么是默克尔有向无环图 2018-08-16 15:58区块链/技术 MerkleDAG作为IPFS的核心数据结构,它融合了Merkle Tree和DAG的优点,今 ...

  5. HOJ 13845 Atomic Computer有向无环图的动态规划

    考虑任意一个数字,任何一个都会有奇怪的..性质,就是一个可以保证不重复的方案——直接简单粗暴的最高位加数字..于是,如同上面的那个题:+1.-1.0 但是考虑到65536KB的标准内存限制,会得出一个 ...

  6. UVA_1025 a Spy in the Metro 有向无环图的动态规划问题

    应当认为,有向无环图上的动态规划问题是动态规划的基本模型之一,对于某个模型,如果可以转换为某一有向无环图的最长.最短路径问题,则可以套用动态规划若干方法解决. 原题参见刘汝佳紫薯267页. 在这个题目 ...

  7. 【学习笔记】有向无环图上的DP

    手动博客搬家: 本文发表于20180716 10:49:04, 原地址https://blog.csdn.net/suncongbo/article/details/81061378 首先,感谢以下几 ...

  8. [转帖]算法精解:DAG有向无环图

    算法精解:DAG有向无环图 https://www.cnblogs.com/Evsward/p/dag.html DAG是公认的下一代区块链的标志.本文从算法基础去研究分析DAG算法,以及它是如何运用 ...

  9. DAG(有向无环图)技术

    什么是DAG? DAG的全称为"Directed Acyclic Graph",中文意思为:有向无环图,它由有限个顶点和"有向边"组成,从任意顶点出发,经过若干 ...

随机推荐

  1. python's default parameter

    [python's default parameter] 对于值类型(int.double)的default函数参数,函数不会保存对默认类型的修改.对于mutable objectd类型的默认参数,会 ...

  2. ubuntu 12.04安装jdk 8

    转载:http://www.itnose.net/detail/6196130.html Ubuntu12.4安装jdk1.8 1.要安装的jdk,我把它拷在了共享文件夹里面.    (用优盘拷也可以 ...

  3. 硬盘smart信息读取

    https://blog.csdn.net/cracker_zhou/article/details/73348966

  4. MyBatis 实用篇(一)入门

    MyBatis 实用篇(一)入门 MyBatis(http://www.mybatis.org/mybatis-3/zh/index.html) 是一款优秀的持久层框架,它支持定制化 SQL.存储过程 ...

  5. 成为一名自由UX设计师--你“够格”吗?

    和传统的朝九晚五,三点一线的生活状态相比,现在互联网时代下的年轻人更崇尚对自由的追求.“可任意支配时间”.“工作场所自由”和“收入高”是人们选择成为自由职业者的主要原因.特别是IT行业中的设计师群体, ...

  6. TF Boys (TensorFlow Boys ) 养成记(六): CIFAR10 Train 和 TensorBoard 简介

    圣诞节玩的有点嗨,差点忘记更新.祝大家昨天圣诞节快乐,再过几天元旦节快乐. 来继续学习,在/home/your_name/TensorFlow/cifar10/ 下新建文件夹cifar10_train ...

  7. Python 关于数组矩阵变换函数numpy.nonzero(),numpy.multiply()用法

    1.numpy.nonzero(condition),返回参数condition(为数组或者矩阵)中非0元素的索引所形成的ndarray数组,同时也可以返回condition中布尔值为True的值索引 ...

  8. Opencascade、OpenGL和OpenSceneGraph的区别与联系

    OpenGL只是三维显示 Openscenegraph基于场景图的概念,它提供一个在OpenGL之上的面向对象的框架,从而能把开发者从实现和优化底层图形的调用中解脱出来 Opencascade更适合算 ...

  9. RSA加密解密总结

    简单的控制台程序 #include"stdafx.h" #include <math.h> #include<string.h> /*/求解密密钥d的函数( ...

  10. 在Ubuntu14.04上安装WordPress4搭建技术博客

    1.安装LAMP环境 1.1 安装Apache2 1.2 安装MySQL5 1.3 安装PHP5 1.4 安装phpMyAdmin 2.初始化数据库 3.下载并配置WordPress 4.配置Apac ...