问题描述:
给出一种方法求无环带权有向连通图(所有权值非负)中从顶点s到顶点t的一条最长简单路径
思路:
Bellman_Ford算法和SPFA算法都可以适用于存在负边权的图求单源最短路径(无回路),因此可以将图中所有边的权值都设置为相反数,求出从顶点s到顶点t的一条最短简单路径,他就是原来图中s到t的最长路径。
下面C++代码采用的是SPFA算法,Bellman_Ford算法相比之下复杂度较高,不过同样可行。代码的不足之处为:虽然能解决问题,但是求最短路径部分完全照搬了SPFA算法,求出了s到所有顶点的最短路径,浪费了空间,如有你知道如何只求s到t的最短路径来提高性能,请在评论区留言,谢谢!
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define INF 0xffffff
//采用SPFA算法,将所有路径的权值取相反数,获得最短路径,即为所求的最长路径
//typedef struct{
// int no; //顶点编号
// int weight; //权重
//}VertexType; //邻接矩阵的节点信息,这里邻接矩阵没有额外info,可以直接用数组存放
typedef struct ArcNode{
int adjvex; //该边邻接点的编号
int weight; //该边的权重(长度)
struct ArcNode *nextarc; //下一个节点
}ArcNode; //表结点
typedef struct VNode{
//char data;
ArcNode *firstarc; //指向第一条边
}VNode,AdjList[20]; //头结点
typedef struct{
AdjList asjList; //头结点数组(这里假设最多只有20个顶点)
int n, e;
}AdjGraph; //邻接表类型
int n, e; //保存图的节点、边的个数
int s, t; //存放起点和终点节点
AdjGraph *G; //图的邻接表
void createAdjList(AdjGraph *&G, vector<vector<int>> AT) //由邻接矩阵创建邻接表
{
ArcNode *p;
G = (AdjGraph *)malloc(sizeof(AdjGraph));
for (int i = 0; i<n; i++)
{
G->asjList[i].firstarc = NULL;
}
for (int i = 0; i<n; i++)
{
for (int j = n - 1; j>=0; j--)
{
if (AT[i][j]