import
java.util.*;
class
GFG {
public
static
int
n, m;
public
static
List<List<Node> > graph
=
new
ArrayList<List<Node> >();
public
static
int
src, dest;
static
class
Node {
public
int
label;
public
int
length;
public
Node(
int
v,
int
w)
{
label = v;
length = w;
}
}
public
static
void
main(String[] args)
throws
Exception
{
n =
5
;
m =
7
;
for
(
int
i =
0
; i <= n; i++) {
List<Node> item =
new
ArrayList<Node>();
graph.add(item);
}
graph.get(
1
).add(
new
Node(
2
,
2
));
graph.get(
2
).add(
new
Node(
1
,
2
));
graph.get(
1
).add(
new
Node(
4
,
4
));
graph.get(
4
).add(
new
Node(
1
,
4
));
graph.get(
1
).add(
new
Node(
5
,
2
));
graph.get(
5
).add(
new
Node(
1
,
2
));
graph.get(
4
).add(
new
Node(
5
,
1
));
graph.get(
5
).add(
new
Node(
4
,
1
));
graph.get(
2
).add(
new
Node(
4
,
3
));
graph.get(
4
).add(
new
Node(
2
,
3
));
graph.get(
2
).add(
new
Node(
3
,
3
));
graph.get(
3
).add(
new
Node(
2
,
3
));
graph.get(
4
).add(
new
Node(
3
,
1
));
graph.get(
3
).add(
new
Node(
4
,
1
));
src =
1
;
dest =
3
;
dijkstra();
}
public
static
void
dijkstra()
{
boolean
[] done =
new
boolean
[n +
1
];
Node[] table =
new
Node[n +
1
];
for
(
int
i =
1
; i <= n; i++)
table[i] =
new
Node(-
1
, Integer.MAX_VALUE);
table[src].length =
0
;
for
(
int
count =
1
; count <= n; count++) {
int
min = Integer.MAX_VALUE;
int
minNode = -
1
;
for
(
int
i =
1
; i <= n; i++) {
if
(!done[i] && table[i].length < min) {
min = table[i].length;
minNode = i;
}
}
done[minNode] =
true
;
ListIterator iter
= graph.get(minNode).listIterator();
while
(iter.hasNext()) {
Node nd = (Node)iter.next();
int
v = nd.label;
int
w = nd.length;
if
(!done[v]
&& table[minNode].length + w
< table[v].length) {
table[v].length
= table[minNode].length + w;
table[v].label = minNode;
}
}
}
System.out.println(
"Wire from "
+ dest +
" to "
+ src +
" with length "
+ table[dest].length);
int
next = table[dest].label;
System.out.print(
"Path is : "
+ dest +
" "
);
while
(next >=
0
) {
System.out.print(next +
" "
);
next = table[next].label;
}
System.out.println();
}
}