// 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();
}