c_cpp 任何一对顶点之间的最长路径
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 任何一对顶点之间的最长路径相关的知识,希望对你有一定的参考价值。
// https://www.geeksforgeeks.org/maximum-edges-can-added-dag-remains-dag/
#include <bits/stdc++.h>
using namespace std;
class graph {
int v;
list<int> *adj;
vector<int> indegree;
vector<int> *weight;
public:
graph(int v) {
this->v= v;
adj= new list<int> [v];
weight= new vector<int> [v];
for (int i=0;i<v; i++)
weight[i]= vector<int> (v, 0);
}
void addEdge(int u, int w, int x) {
adj[u].push_back(w);
adj[w].push_back(u);
weight[u][w]= x;
weight[w][u]= x;
}
void LP();
void DFSUtil (int , bool[], int&, int& , int );
};
void graph::DFSUtil(int s, bool visited[], int &currlen, int &maxlen, int parent) {
visited[s]=1;
bool flag= false;
list<int>::iterator i;
for (i= adj[s].begin(); i!= adj[s].end(); ++i) {
if (!visited[*i]) {
flag= true;
currlen+= weight[s][*i];
DFSUtil(*i, visited, currlen, maxlen, s);
}
}
if (!flag) {
cout<<s<< "-"<< currlen << " ";
if (currlen>maxlen)
maxlen= currlen;
}
if (parent!= -1)
currlen-= weight[parent][s];
}
void graph::LP() {
int maxlen= INT_MIN;
for (int i=0; i<v; i++) {
cout<< i<< ":\n";
bool visited[v]= {0};
int currlen=0;
DFSUtil (i, visited, currlen, maxlen, -1);
cout<< "\n";
}
cout<< "Longest path is: "<< maxlen;
}
int main() {
graph g(6);
g.addEdge(0,1,3);
g.addEdge(1,2,4);
g.addEdge(1,5,2);
g.addEdge(5,3,6);
g.addEdge(5,4,7);
g.LP();
}
以上是关于c_cpp 任何一对顶点之间的最长路径的主要内容,如果未能解决你的问题,请参考以下文章
计算无向图中有约束的所有一对顶点
Floyd佛洛伊德算法
LeetCode 310. 最小高度树(找树中的最长路径) / 796. 旋转字符串 / 429. N 叉树的层序遍历
c_cpp 来自顶点的给定长度的所有路径
c_cpp DAG最长路径
c_cpp 找到具有给定约束的矩阵中的最长路径