using System;
using System.Collections.Generic;
class Graph {
public int V;
public List<(int, int)>[] adj;
public Graph(int v) {
V = v;
adj = new List<(int, int)>[v];
for (int i = 0; i < v; i++) {
adj[i] = new List<(int, int)>();
}
}
public void AddEdge(int u, int v, int w) {
adj[u].Add((v, w));
}
private void TopologicalSortUtil(int v, bool[] visited, Stack<int> stack) {
visited[v] = true;
foreach (var (nbr, _) in adj[v]) {
if (!visited[nbr]) {
TopologicalSortUtil(nbr, visited, stack);
}
}
stack.Push(v); // push after visiting neighbors
}
public Stack<int> TopologicalSort() {
bool[] visited = new bool[V];
Stack<int> stack = new Stack<int>();
for (int i = 0; i < V; i++) {
if (!visited[i]) {
TopologicalSortUtil(i, visited, stack);
}
}
return stack;
}
public int[] ShortestPath(int start) {
int[] dist = new int[V];
for (int i = 0; i < V; i++) {
dist[i] = int.MaxValue;
}
dist[start] = 0;
Stack<int> stack = TopologicalSort();
while (stack.Count > 0) {
int u = stack.Pop();
if (dist[u] != int.MaxValue) {
foreach (var (v, w) in adj[u]) {
if (dist[u] + w < dist[v]) {
dist[v] = dist[u] + w; // relax edge
}
}
}
}
return dist;
}
}
class Program {
static void Main() {
Graph g = new Graph(5);
g.AddEdge(0, 1, 2);
g.AddEdge(0, 2, 4);
g.AddEdge(1, 3, 7);
g.AddEdge(1, 4, 3);
g.AddEdge(2, 4, 5);
int start = 0;
int[] dist = g.ShortestPath(start);
for (int i = 0; i < dist.Length; i++) {
if (dist[i] == int.MaxValue) {
Console.WriteLine($"Distance from {start} to {i} is Infinity");
} else {
Console.WriteLine($"Distance from {start} to {i} is {dist[i]}");
}
}
}
}stack.Push(v); // push after visiting neighbors
Add node to stack after all its descendants are processed to get topological order
Initialize start node distance to zero
while (stack.Count > 0) {
Process nodes in topological order
if (dist[u] != int.MaxValue) {
Only relax edges from nodes reachable from start
if (dist[u] + w < dist[v]) {
Relax edge if new distance is shorter
dist[v] = dist[u] + w; // relax edge
Update shortest distance to neighbor
Distance from 0 to 0 is 0
Distance from 0 to 1 is 2
Distance from 0 to 2 is 4
Distance from 0 to 3 is 9
Distance from 0 to 4 is 5