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 找到具有给定约束的矩阵中的最长路径