using
System;
using
System.Collections.Generic;
class
AdjListNode {
private
int
v;
private
int
weight;
public
AdjListNode(
int
_v,
int
_w)
{
v = _v;
weight = _w;
}
public
int
getV() {
return
v; }
public
int
getWeight() {
return
weight; }
}
class
Graph {
private
int
V;
private
List<AdjListNode>[] adj;
public
Graph(
int
v)
{
V = v;
adj =
new
List<AdjListNode>[ v ];
for
(
int
i = 0; i < v; i++)
adj[i] =
new
List<AdjListNode>();
}
public
void
AddEdge(
int
u,
int
v,
int
weight)
{
AdjListNode node =
new
AdjListNode(v, weight);
adj[u].Add(node);
}
private
void
LongestPathUtil(
int
v,
bool
[] visited,
Stack<
int
> stack)
{
visited[v] =
true
;
foreach
(AdjListNode node
in
adj[v])
{
if
(!visited[node.getV()])
LongestPathUtil(node.getV(), visited,
stack);
}
stack.Push(v);
}
public
void
LongestPath(
int
s)
{
int
[] dist =
new
int
[V];
for
(
int
i = 0; i < V; i++)
dist[i] = Int32.MaxValue;
dist[s] = 0;
Stack<
int
> stack =
new
Stack<
int
>();
bool
[] visited =
new
bool
[V];
for
(
int
i = 0; i < V; i++) {
if
(visited[i] ==
false
)
LongestPathUtil(i, visited, stack);
}
while
(stack.Count > 0) {
int
u = stack.Pop();
if
(dist[u] != Int32.MaxValue) {
foreach
(AdjListNode v
in
adj[u])
{
if
(dist[v.getV()]
> dist[u] + v.getWeight() * -1)
dist[v.getV()]
= dist[u] + v.getWeight() * -1;
}
}
}
for
(
int
i = 0; i < V; i++) {
if
(dist[i] == Int32.MaxValue)
Console.Write(
"INT_MIN "
);
else
Console.Write(
"{0} "
, dist[i] * -1);
}
Console.WriteLine();
}
}
public
class
GFG {
static
void
Main(
string
[] args)
{
Graph g =
new
Graph(6);
g.AddEdge(0, 1, 5);
g.AddEdge(0, 2, 3);
g.AddEdge(1, 3, 6);
g.AddEdge(1, 2, 2);
g.AddEdge(2, 4, 4);
g.AddEdge(2, 5, 2);
g.AddEdge(2, 3, 7);
g.AddEdge(3, 5, 1);
g.AddEdge(3, 4, -1);
g.AddEdge(4, 5, -2);
int
s = 1;
Console.WriteLine(
"Following are longest distances from source vertex {0} "
,
s);
g.LongestPath(s);
}
}