-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPathinDAG.cpp
96 lines (95 loc) · 2.15 KB
/
PathinDAG.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
class graph
{
public:
unordered_map<int, list<pair<int, int>>> adj;
void addEdge(int u, int v, int weight)
{
pair<int, int> p = make_pair(v, weight);
adj[u].push_back(p);
}
void printAdj()
{
for (auto i : adj)
{
cout << i.first << "->";
for (auto j : i.second)
{
cout << "(" << j.first << "," << j.second << "), ";
}
cout << endl;
}
}
void dfs(int node, unordered_map<int, bool> &visited, stack<int> &topo)
{
visited[node] = true;
for (auto neighbour : adj[node])
{
if (!visited[neighbour.first])
{
dfs(neighbour.first, visited, topo);
}
}
topo.push(node);
}
void getShortestPath(int src, vector<int> &dist, stack<int> &topo)
{
dist[src] = 0;
while (!topo.empty())
{
int top = topo.top();
topo.pop();
if (dist[top] != INT_MAX)
{
for (auto i : adj[top])
{
if (dist[top] + i.second < dist[i].first)
{
dist[i].first = dist[top] + i.second;
}
}
}
}
}
};
int main()
{
graph g;
g.addEdge(0, 1, 5);
g.addEdge(0, 2, 3);
g.addEdge(1, 2, 2);
g.addEdge(1, 3, 6);
g.addEdge(2, 3, 7);
g.addEdge(2, 4, 4);
g.addEdge(2, 5, 2);
g.addEdge(3, 4, -1);
g.addEdge(4, 5, -2);
g.printAdj();
int n = 6; // n-->totalNode
// topological sort
unordered_map<int, bool> visited;
stack<int> s;
for (int i = 0; i < n; i++)
{
if (!visited[i])
{
g.dfs(i, visited, s);
}
}
int src = 1;
vector<int> dist(n);
for (int i = 0; i < n; i++)
{
dist[i] = INT_MAX;
}
g.getShortestPath(src, dist, s);
cout << "ans is: " << endl;
for (int i = 0; i < dist.size(); i++)
{
cout << dist[i] << " ";
}
cout << endl;
return 0;
}