-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLinkState.java
More file actions
120 lines (98 loc) · 3.63 KB
/
LinkState.java
File metadata and controls
120 lines (98 loc) · 3.63 KB
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.Scanner;
public class LinkState {
static Scanner scanner = new Scanner(System.in);;
static ArrayList<Integer> gateways;
static int prev[];
static class Graph {
int vertices;
int adjMatrix[][];
public Graph(int vertex) {
this.vertices = vertex;
adjMatrix = new int[vertex][vertex];
for (int i = 0; i < vertex; i++) {
String line = scanner.nextLine();
for (int j = 0; j < vertex; j++) {
String[] data = line.split(" ");
adjMatrix[i][j] = Integer.parseInt(data[j]);
}
}
String[] tmp = scanner.nextLine().split(" ");
gateways = new ArrayList<>();
for (int k = 0; k < tmp.length; k++) {
gateways.add(Integer.parseInt(tmp[k]));
}
}
int getMinVertex(boolean[] mst, int[] key) {
int minKey = Integer.MAX_VALUE;
int vertex = -1;
for (int i = 0; i < vertices; i++) {
if (mst[i] == false && minKey > key[i]) {
minKey = key[i];
vertex = i;
}
}
return vertex;
}
public int[] dijkstra(int source) {
boolean[] spt = new boolean[vertices];
int[] dist = new int[vertices];
prev = new int[vertices];
int INFINITY = Integer.MAX_VALUE;
for (int i = 0; i < vertices; i++) {
dist[i] = INFINITY;
prev[i] = 0;
}
dist[source] = 0;
for (int i = 0; i < vertices; i++) {
int vert_u = getMinVertex(spt, dist);
spt[vert_u] = true;
for (int vert_v = 0; vert_v < vertices; vert_v++) {
if (adjMatrix[vert_u][vert_v] > 0) {
if (spt[vert_v] == false && adjMatrix[vert_u][vert_v] != -1) {
int newKey = adjMatrix[vert_u][vert_v] + dist[vert_u];
if (newKey < dist[vert_v]) {
dist[vert_v] = newKey;
prev[vert_v] = vert_u + 1;
}
}
}
}
}
return dist;
}
}
public static void printGraph(int source, int[] key) {
System.out.println("Forwarding table for " + (source + 1));
System.out.println(" To Cost Next Hop");
int nextHop = 0;
for (int i = 0; i < gateways.size(); i++) {
for (int j = 0; j < prev.length; j++) {
if (prev[j] == (source + 1)) {
nextHop = j + 1;
prev[j] = 0;
break;
}
}
System.out.println(" " + gateways.get(i) + " "
+ key[gateways.get(i) - 1] + " " + nextHop);
}
System.out.println();
}
public static void main(String args[]) {
int vertices = Integer.parseInt(scanner.nextLine());
Graph graph = new Graph(vertices);
int[] d = new int[vertices];
for (int i = 0; i < vertices; i++) {
if (!gateways.contains(i + 1)) {
d = graph.dijkstra(i);
printGraph(i, d);
}
}
}
}