C++多段图的向后处理算法BGRAPH

几种图神经网络方法总结(Graph Neural Network) 概要 今年来图神经网络受到大家越来越多的关注,在文本分类(Text classification),序列标注(Sequence labeling), 神经机器翻译(Neural machine translation),关系抽取(Relation extraction),事件抽取(Event extraction), 图像分类(Image Classification),视觉推理(Visual R... 阅读详情

余祥宣, 崔国华, 邹海明. 计算机算法基础.3版[M]. 华中科技大学出版社, 2006.
P128 算法6.2
使用的数据结构是反向邻接表
程序的输入是一个名字为input.txt的文件,保存时注意编码格式再VS上运行的话要保存为ANSI编码,如果需要的话我可以上传一份
//测试数据2
//增加4到7权重为7
//增加7到12权重为4

12 22 5
2 1 9
3 1 7
4 1 3
5 1 2
6 2 4
7 2 2
8 2 1
6 3 2
7 3 7
8 4 11
7 4 7
7 5 11
8 5 8
9 6 6
10 6 5
9 7 4
10 7 3
12 7 4
10 8 5
11 8 6
12 9 4
12 10 2
12 11 5

//测试数据2
//增加4到7权重为7

12 22 5
2 1 9
3 1 7
4 1 3
5 1 2
6 2 4
7 2 2
8 2 1
6 3 2
7 3 7
8 4 11
7 4 7
7 5 11
8 5 8
9 6 6
10 6 5
9 7 4
10 7 3
10 8 5
11 8 6
12 9 4
12 10 2
12 11 5

//测试数据1

12 21 5
2 1 9
3 1 7
4 1 3
5 1 2
6 2 4
7 2 2
8 2 1
6 3 2
7 3 7
8 4 11
7 5 11
8 5 8
9 6 6
10 6 5
9 7 4
10 7 3
10 8 5
11 8 6
12 9 4
12 10 2
12 11 5

#include<iostream>
#include<fstream>
using namespace std;

#define MAX 13
#define MAXCOST 0x7fffffff/2  //设为最大值整数加法溢出

int BCOST[MAX];
int COST[MAX][MAX];
int D[MAX];
int P[MAX];

typedef int EdgeWeight;//权值类型
typedef struct EdgeNode
{
    int adjvex; //邻接点  
    EdgeWeight weight; //权值  
    struct EdgeNode* next; //指向下一条边  

}EdgeNode;

typedef int VertexType; //顶点类型  
typedef struct
{
    VertexType data;
    EdgeNode* pFirstEdge; //指示第一条边  
}VertexNode;

typedef VertexNode AdjList[MAX];//邻接表  

typedef struct
{
    AdjList adjList; //邻接表  
    int iVexNum; //顶点个数  
    int iEdgeNum; //边数  
    int iLayer;//段数
}AdjListGraph;

//由顶点值得到顶点索引  
int GetIndexByVertexVal(const AdjListGraph& G, VertexType val)
{
    for (int i = 1; i <= G.iVexNum; ++i)
    {
        if (val == G.adjList[i].data)
            return i;
    }
    return -1;
}
//创建有向图  
void CreateAdjListGraph(AdjListGraph& G)
{
    ifstream in("input.txt");
    in >> G.iVexNum >> G.iEdgeNum>>G.iLayer;

    for (int i = 0; i <= G.iVexNum; ++i)
    {
        G.adjList[i].data = i;
        G.adjList[i].pFirstEdge = NULL;
    }

    for (int i = 0; i <= G.iEdgeNum; ++i)
    {
        VertexType first;
        VertexType second;
        int weight;
        in >> first >> second >> weight;
        int m = GetIndexByVertexVal(G, first);
        int n = GetIndexByVertexVal(G, second);
        if (m == -1 || n == -1)
            return;
        EdgeNode* pEdgeNode = new EdgeNode;
        pEdgeNode->adjvex = n;
        pEdgeNode->weight = weight;  //权值 

        //表头插入法  
        pEdgeNode->next = G.adjList[m].pFirstEdge;
        G.adjList[m].pFirstEdge = pEdgeNode;
    }
}

void BGRAPH(int k,int n,int P[], AdjListGraph& G)
{
    for (int i = 0; i <= n; i++)
        BCOST[i] = MAXCOST;

    int r=0, j;
    BCOST[1] = 0;

    for (j = 2; j <= n; j++)
    {
        EdgeNode* pEdge = G.adjList[j].pFirstEdge;
        int _r;
        while (pEdge)
        {
            _r = pEdge->adjvex;
            if (BCOST[_r] + pEdge->weight <BCOST[j])
            {
                r = _r;
                BCOST[j] = BCOST[r] + pEdge->weight;
            }
            pEdge = pEdge->next;
        }

        D[j] = r;
    }
    P[1] = 1;
    P[k] = n;
    for (j = k - 1; j >= 2; j--)
    {
        P[j] = D[P[j + 1]];
    }

}

int main()
{
    //创建有向图  
    AdjListGraph G;
    CreateAdjListGraph(G);
    cout << endl;
    int k = 0;
    for (int i = 1; i <= 12; i++)
    {
        cout << i ;
        EdgeNode* pEdge = G.adjList[i].pFirstEdge;
        while (pEdge)
        {
            cout << " => " << pEdge->adjvex << "(" << pEdge->weight<<")"; k++;
            pEdge = pEdge->next;
        }
        cout << endl;
    }

    BGRAPH(G.iLayer, G.iVexNum, P, G);
    cout << endl;
    for (int i = 1; i <= G.iLayer; i++)
    {
        cout << "=>"<<P[i];
    }
    cout << endl;
    system("pause");
    return 0;
}

运行结果
C++多段图的向后处理算法BGRAPH运行结果1
C++多段图的向后处理算法BGRAPH运行结果2
C++多段图的向后处理算法BGRAPH运行结果3

动态规划的算法解决多段图问题 给定一个有向多段图,使用动态规划的算法思想设计出算法实现多段图的最短路径问题,并输出路径! 立即下载

相关推荐

动态规划解多段图问题

使用动态规划求解多段图问题的算法,C语言实现

多段图 java 邻接表_多段图算法

COST(i,j)=min{c(j,v) + COST(i+1,v)}(v∈Vk+1,∈E)COST(3,6) = min{6+COST(4,9), 5+COST(4,10)} = 7 (已知COST(4,9)=4,COST(4,10)=2)COST(3,7) = min{4+COST(4,9), 3+COST(4,10)}= 5COST(3,8) = 7COST(2,2) = min{4+COS...

weixin_29243063的博客 258

多段图的最短路径问题 动态规划法——C++代码

课程的随堂作业,C语言的,用dev就能运行,萌新代码,勿喷,仅仅帮助不想写作业的朋友方便一下,反正老师也不会仔细检查的

B Graph(异或最小生成树)

Graph 思路 图是联通的,并且加边的时候要保证环一定是异或值为0,所以我们可以保证从一个点到另一个点的路径异或值是不变的,这个时候就简单了,不就是一个异或最小生成树了嘛。 我们只要预处理一下,任选一个点作为根节点去得到从这个点到其他点的路径异或值,然后再做一遍异或最小生成树即可。 代码 /* Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc++.h> #d

lifehappy 695

CP2102 USB 转 UART 模块 PCB 设计项目

不幸的是,我的笔记本电脑只有 USB 端口,所以我需要在 USB 端口和 UART 接口之间进行转换。PCB 布局将足够小,因此我们不一定需要高速布线 USB 线路,但我们将在此将其作为一个简单的示例来实现,以展示如何在这种类型的电路板上实现它。相反,我们只使用屏幕左侧的电路。在这里,我们利用对之间的间距和到 L1 上的铜灌注的距离将差分阻抗设置为目标值。初始布局分为两个部分:USB 连接器和 USB 线路的 TVS 二极管放置在电路板左侧,带有二极管 D4 和 D5 的引脚接头放置在电路板右侧。

jkh920184196的博客 2401

PX4/ArduPilot源码克隆提速秘籍:国内镜像与子模块优化全攻略

本文详细介绍了PX4/ArduPilot源码克隆的提速秘籍,包括使用国内镜像源和子模块优化技巧。通过阿木实验室、华为云等国内镜像,克隆速度可提升20倍,同时提供子模块替换和并行编译等实用方法,大幅提升开发效率。

weixin_29251567的博客 524

【动态规划】多段图最短路径(动图演示)

写在前面: 多段图是一个有向的无环图。求解从起始点v0到终止点的最短路径的长度, 首先看一下这个问题是否具有最优子结构的性质。对于每一点来说,从v0 到它的最短路径有两种可能,分别是从v0直接到该点或者是从最短的前驱 节点开始到该节点。从这里可以看出有递归的性质,所以使用回溯的方法 也是可以解决的。即从终点开始,依次向前找到最短的路径。由于递归本 身所用的时间较长,并且在回溯的过程中存在重复的工作,所以使用动态规划更好。 动图演示: 多段图: 假设图G=(V,E)是一个带权的有向图,如果可以.

Javascript_tsj的博客 1万+

保姆级教程:用Code Blocks搞定中科蓝讯AB5768E蓝牙音响SDK开发环境(附资源包)

本文提供了一份详细的Code Blocks配置指南,帮助开发者快速搭建中科蓝讯AB5768E蓝牙音响SDK开发环境。从工具链安装、环境配置到工程导入和调试技巧,涵盖全流程避坑要点,特别适合K12开发板初学者。附资源包下载,助您高效完成蓝牙音响开发。

weixin_28692817的博客 448

动态规划中的多段图问题

多段图的最短路径问题:只有相邻的节点之间有联系 多段图的定义: 1.多段图是一个有向、无环、带权 图。 2.有且仅有一个起始结点(原点source) 和 一个终止结点(汇点target)。 3.它有n个阶段,每个阶段由特定的几个结点构成。每个结点的所有结点都只能指向下一个相邻的阶段,阶段之间不能越界。 算法步骤: 从前往后依次给所有结点编号;序号必须从0开始,依次递增,同一阶段的结点顺序可以随意; 1.计算s->t的最短路径问题:首先进行部分分解d(s,v) 递推公式: 2.根据递推公式求出该图的

Keep_Trying_Go的博客 4662

图像相似度的评价指标 : FID(Fréchet Inception Distance)

FID(Fréchet Inception Distance) 是用来计算真实图像与生成图像的特征向量间距离的一种度量。如果FID值越小,则相似程度越高。最好情况即是FID=0,两个图像相同。 实际计算: 参考链接:https://machinelearningmastery.com/how-to-implement-the-frechet-inception-distance-fid-from-scratch/ # example of calculating the frechet inceptio

weixin_43723625的博客 1万+

VMware17安装教程(附安装包)VMware17小白详细一键安装教程

VMware 17.5 是一款强大的虚拟机软件。本安装教程将为您详细介绍VMware17安装教程其下载、安装步骤及验证方法,助您轻松完成安装,开启虚拟化体验。

2501_91538706的博客 2万+

多段图问题-动态规划解法

问题描述:设图G=(V, E)是一个带权有向图,如果把顶点集合V划分成k个互不相交的子集Vi (2≤k≤n, 1≤i≤k),使得对于E中的任何一条边(u, v),必有u∈Vi,v∈Vi+m (1≤i≤k, 1<i+m≤k),则称图G为多段图,称s∈V1为源点,t∈Vk为终点。多段图的最短路径问题求从源点到终点的最小代价路径。

jsjsjejsj的博客 2082

手把手教你用VS Code + Codex在WSL中高效编程(避坑指南)

本文提供了一份详细的避坑指南,教你如何在WSL环境中高效配置和使用VS Code与OpenAI Codex。文章核心在于解决WSL内Codex扩展的OAuth登录失败问题,推荐将扩展安装在Windows本地,并通过UNC路径直接访问WSL文件系统,从而实现AI辅助编程与Linux开发环境的无缝结合,提升编码效率。

weixin_28677451的博客 1067

(C/C++)动态规划:多段图最短路径、有向无环图最短路径、最长递增不连续子序列

多段图的最短路径问题 建立一个从源点S到终点T的多段图,设计一个动态规划算法求出从S到T的最短路径值,并输出相应的最短路径。 思路 首先确定能分段,即每一层的各个结点互不连通,后驱结点均在同一层。 通过有一定修改的bfs进行分段,然后从最后一段,依段数逐段取最小路径,有点类似最小路径算法。 #include <iostream> #include <vector>...

周周的奇妙代码之旅 4532

智能水下机器人设计: 基于MATLAB的水下机器人动力学建模和控制系统设计,包括水下环境感知、路径规划和任务执行等

智能水下机器人是指能够在水下自主完成各种任务的机器人,例如探测、勘察、救援等。它具有广阔的应用前景,可用于海洋环境监测、水下考古、海上作业等领域。基于MATLAB的水下机器人设计可以为科研人员和工程师提供强大的建模和仿真工具,帮助他们设计更智能、更高效的水下机器人。智能水下机器人是未来海洋科技发展的重要方向,它将为海洋科学研究、水下考古和海上作业等领域带来新的机遇。MATLAB是一种功能强大的数学和科学计算软件,它可以为智能水下机器人设计提供强大的工具和支持。

走向CTO的路上... 963

FPGA上的时间数字转换器(TDC):详细概述及FPGA开发

本文对基于FPGA的时间数字转换器(TDC)进行了详细的概述,并提供了一个简单的示例代码,展示了如何在FPGA上实现TDC功能。在本文中,我们将详细概述基于FPGA的TDC,并提供相应的源代码示例,以帮助读者理解和实现这一功能。需要注意的是,这只是一个简单的示例,实际的TDC设计可能需要更多的功能和优化,以满足特定的需求。读取和重置:最后,测量结果可以通过读取计数器的值来获取,并且在每次读取后需要将计数器重置为零,以便进行下一次测量。TDC的基本原理是测量信号的到达时间与参考时钟之间的时间差。

EsqpWeller的博客 6868

算法设计与分析——多段图的最短路径问题(Java)

不失一般性,将多段图的顶点按照段的顺序进行编号,同一段内顶点的顺序无关紧要。假设图中的顶点个数为 n,则源点 s 的编号为 0,终点t的编号为 n-1,并且对图中的任何一条边,顶点 u 的编号小于顶点 v 的编号。设数组 cost[ n ] 存储最短路径长度,cost[ j ] 表示从源点 s 到顶点 j 的最短路径长度,数组 path[ n ] 记录状态转移,path[ j ] 表示从源点 s 到顶点 j 的路径上顶点 j 的前一个顶点,动态规划法求解多段图的最短路径问题的算法如下。

qq_53709454的博客 4254

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

动态规划——多段图问题

多段图问题 多段图问题是利用动态规划思想解决的经典问题之一,在日常生活中应用广泛。 问题描述 若存在一个有向加权图G,且G能分出起点和终点以及中间的n的阶段,求起点到终点的最短(长)距离。 分析设计 通过上图我们可以很容易知道,如果用穷举的方法是没有办法求解的,问题规模实在太大,我们需要使用其他更为高效的算法:动态规划。 动态规划解决该问题的主要思想:n个阶段的大问题很难求解,可以将其进行划分成...

Mr.DImple的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

多段图的动态规划算法(C/C++)

多段图的动态规划求从源点到汇点的最短路径C++语言描述

XUELEIQIANQIU的博客 6981

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

算法笔记一之多段图问题(动态规划)【应试版】

动态规划(Dynamic Programming,简称DP)是一种算法策略,用于解决具有重叠子问题和最优子结构特性的问题。多段图问题是一种特殊的动态规划问题,通常涉及到将一个整体问题分解成多个子问题,这些子问题可以看作是图中的多个段落或部分,然后通过解决这些子问题来解决整个问题。

qq_55170097的博客 2120

多段图最短路径(动态规划法)

问题描述:设图G=(V, E)是一个带权有向图,如果把顶点集合V划分成k个互不相交的子集Vi (2≤k≤n, 1≤i≤k),使得对于E中的任何一条边(u, v),必有u∈Vi,v∈Vi+m (1≤i≤k, 1<i+m≤k),则称图G为多段图,称s∈V1为源点,t∈Vk为终点。多段图的最短路径问题求从源点到终点的最小代价路径。

2301_79582459的博客 2371

动态规划---->多段图

多段图 多段图问题是求由s到t的最小成本路径。   图中的结点被划分成 k≥ 2个不相交的集合Vi , 1≤i≤k,其中V1和Vk分别只有一个结点 s (源点) 和t ( 汇点)。 多段图向前处理的算法 1、算法执行过程 COST[j]=c(j,r)+COST[r]; 第4段            COST(4,9) = c(9,12) = 4                 ...

weixin_34293902的博客 1599

牛客多校第5场B-Graph

题意 给定一个顶点个数为nnn、边数为n−1n-1n−1的图,图上的边有边权,可执行的操作为在任意两个不连通的点之间连一条边和删去一条边,但在任何时候都应满足图是连通的且图中的任意一个环的所有边的边权异或和为000。 求图中边权和(不是异或和)的最小值。 (n≤100000n\leq100000n≤100000) 题解 在操作的过程中这个图一定会保持树的状态。 异或的最基本的性质就是 x xor x=0x\ xor\ x=0x xor x=0。 根据这个性质可以知道,

Fisheory的博客 312

tensorflow || 2. tensorflow框架实现的Graph总结

1. Graph 在tensorflow官方文档中,Graph被定义为“一些Operation和Tensor的集合”。我们使用的python代码表达的计算,就会生成一张图。并在tensorboard中可视化 import tensorflow as tf Bgraph = tf.Graph() # 创建一个图Bgraph with Bgraph.as_default(): # 将Bgraph图设为当默认图 Bdata1 = tf.placeholder(tf.float32, name="

magic_ll的博客 1083

2020牛客暑期多校训练营(第五场)B Graph —— boruvka最小生成树+字典树

This way 题意: 现在有一棵树,每条边都有一个权值,现在你每次可以做一个操作:加入一条边或者删除一条边。最终使得所有边的权值和最小。 在加入删除的时候要满足以下两条: 1.这张图必须联通 2.每个环上的边的异或和为0 题解: 我在做的时候已经用字典树去做了,但是没有想到用Boruva生成树,在比赛期间没做出来…该死我好菜。这道题好像和CF888G非常相似,代码也基本没变。 首先介绍一下boruvka,它一般用于边由两个点的值通过一些操作之后得到的图中求最小生成树。 做法就是每次找到两个集合,枚举较

天翼之城的博客 687

2020牛客暑期多校训练营(第五场)B Graph

根据题目描述我们可以知道,无论添加的时间顺序,添加a-b的边的大小一定是固定的,即a-b上的路径上的所有长度的异或,所以题目就可以简化成寻找完全图的最小生成树。 设dis[n]为0-n点的链路上所有边长的的异或,则在之前所说的完全图中,a-b的边长就是dis[a] ^ dis[b],即为a-b上的路径上的所有长度的异或(假设最小公共祖先为c,dis[a]^dis[b]中有两段多余的0-c的异或会被相互中和掉)。则相当于每个点有一个值dis[n],而两点之间边长即为dia[a]^dis[b]...

柳予欣的三味书屋~ 1822
上一篇: C++生成最短路径的贪心算法SHORTEST_PATHS
下一篇: C++找最小成本二分检索树OBST
小英雄Dui
博客等级 码龄11年 37粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值