FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
Java/DataStructures/Graphs/BellmanFord.java at master · coder2hacker/Java · GitHub
Uh oh!
There was an error while loading.
Please reload this page
.
coder2hacker
/
Java
Public
forked from
TheAlgorithms/Java
Notifications
You must be signed in to change notification settings
Fork
0
Star
2
Code
Pull requests
0
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
Java
/
DataStructures
/
Graphs
/
BellmanFord.java
Copy path
More file actions
More file actions
Latest commit
History
History
History
161 lines (154 loc) · 4.78 KB
Breadcrumbs
Java
/
DataStructures
/
Graphs
/
BellmanFord.java
Copy path
File metadata and controls
161 lines (154 loc) · 4.78 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package
DataStructures
.
Graphs
;
import
java
.
util
.*;
class
BellmanFord
/*Implementation of Bellman ford to detect negative cycles. Graph accepts inputs in form of edges which have
start vertex, end vertex and weights. Vertices should be labelled with a number between 0 and total number of vertices-1,both inclusive*/
{
int
vertex
,
edge
;
private
Edge
edges
[];
private
int
index
=
0
;
BellmanFord
(
int
v
,
int
e
) {
vertex
=
v
;
edge
=
e
;
edges
=
new
Edge
[
e
];
}
class
Edge
{
int
u
,
v
;
int
w
;
/**
* @param u Source Vertex
* @param v End vertex
* @param c Weight
*/
public
Edge
(
int
a
,
int
b
,
int
c
) {
u
=
a
;
v
=
b
;
w
=
c
;
}
}
/**
* @param p[] Parent array which shows updates in edges
* @param i Current vertex under consideration
*/
void
printPath
(
int
p
[],
int
i
) {
if
(
p
[
i
] == -
1
)
// Found the path back to parent
return
;
printPath
(
p
,
p
[
i
]);
System
.
out
.
print
(
i
+
" "
);
}
public
static
void
main
(
String
args
[]) {
BellmanFord
obj
=
new
BellmanFord
(
0
,
0
);
// Dummy object to call nonstatic variables
obj
.
go
();
}
public
void
go
()
// Interactive run for understanding the class first time. Assumes source vertex is 0 and
// shows distance to all vertices
{
Scanner
sc
=
new
Scanner
(
System
.
in
);
// Grab scanner object for user input
int
i
,
v
,
e
,
u
,
ve
,
w
,
j
,
neg
=
0
;
System
.
out
.
println
(
"Enter no. of vertices and edges please"
);
v
=
sc
.
nextInt
();
e
=
sc
.
nextInt
();
Edge
arr
[] =
new
Edge
[
e
];
// Array of edges
System
.
out
.
println
(
"Input edges"
);
for
(
i
=
0
;
i
<
e
;
i
++) {
u
=
sc
.
nextInt
();
ve
=
sc
.
nextInt
();
w
=
sc
.
nextInt
();
arr
[
i
] =
new
Edge
(
u
,
ve
,
w
);
}
int
dist
[] =
new
int
[
v
];
// Distance array for holding the finalized shortest path distance between source
// and all vertices
int
p
[] =
new
int
[
v
];
// Parent array for holding the paths
for
(
i
=
0
;
i
<
v
;
i
++)
dist
[
i
] =
Integer
.
MAX_VALUE
;
// Initializing distance values
dist
[
0
] =
0
;
p
[
0
] = -
1
;
for
(
i
=
0
;
i
<
v
-
1
;
i
++) {
for
(
j
=
0
;
j
<
e
;
j
++) {
if
((
int
)
dist
[
arr
[
j
].
u
] !=
Integer
.
MAX_VALUE
&&
dist
[
arr
[
j
].
v
] >
dist
[
arr
[
j
].
u
] +
arr
[
j
].
w
) {
dist
[
arr
[
j
].
v
] =
dist
[
arr
[
j
].
u
] +
arr
[
j
].
w
;
// Update
p
[
arr
[
j
].
v
] =
arr
[
j
].
u
;
}
}
}
// Final cycle for negative checking
for
(
j
=
0
;
j
<
e
;
j
++)
if
((
int
)
dist
[
arr
[
j
].
u
] !=
Integer
.
MAX_VALUE
&&
dist
[
arr
[
j
].
v
] >
dist
[
arr
[
j
].
u
] +
arr
[
j
].
w
) {
neg
=
1
;
System
.
out
.
println
(
"Negative cycle"
);
break
;
}
if
(
neg
==
0
)
// Go ahead and show results of computation
{
System
.
out
.
println
(
"Distances are: "
);
for
(
i
=
0
;
i
<
v
;
i
++)
System
.
out
.
println
(
i
+
" "
+
dist
[
i
]);
System
.
out
.
println
(
"Path followed:"
);
for
(
i
=
0
;
i
<
v
;
i
++) {
System
.
out
.
print
(
"0 "
);
printPath
(
p
,
i
);
System
.
out
.
println
();
}
}
sc
.
close
();
}
/**
* @param source Starting vertex
* @param end Ending vertex
* @param Edge Array of edges
*/
public
void
show
(
int
source
,
int
end
,
Edge
arr
[])
// Just shows results of computation, if graph is passed to it. The graph should
// be created by using addEdge() method and passed by calling getEdgeArray() method
{
int
i
,
j
,
v
=
vertex
,
e
=
edge
,
neg
=
0
;
double
dist
[] =
new
double
[
v
];
// Distance array for holding the finalized shortest path distance between source
// and all vertices
int
p
[] =
new
int
[
v
];
// Parent array for holding the paths
for
(
i
=
0
;
i
<
v
;
i
++)
dist
[
i
] =
Integer
.
MAX_VALUE
;
// Initializing distance values
dist
[
source
] =
0
;
p
[
source
] = -
1
;
for
(
i
=
0
;
i
<
v
-
1
;
i
++) {
for
(
j
=
0
;
j
<
e
;
j
++) {
if
((
int
)
dist
[
arr
[
j
].
u
] !=
Integer
.
MAX_VALUE
&&
dist
[
arr
[
j
].
v
] >
dist
[
arr
[
j
].
u
] +
arr
[
j
].
w
) {
dist
[
arr
[
j
].
v
] =
dist
[
arr
[
j
].
u
] +
arr
[
j
].
w
;
// Update
p
[
arr
[
j
].
v
] =
arr
[
j
].
u
;
}
}
}
// Final cycle for negative checking
for
(
j
=
0
;
j
<
e
;
j
++)
if
((
int
)
dist
[
arr
[
j
].
u
] !=
Integer
.
MAX_VALUE
&&
dist
[
arr
[
j
].
v
] >
dist
[
arr
[
j
].
u
] +
arr
[
j
].
w
) {
neg
=
1
;
System
.
out
.
println
(
"Negative cycle"
);
break
;
}
if
(
neg
==
0
)
// Go ahead and show results of computaion
{
System
.
out
.
println
(
"Distance is: "
+
dist
[
end
]);
System
.
out
.
println
(
"Path followed:"
);
System
.
out
.
print
(
source
+
" "
);
printPath
(
p
,
end
);
System
.
out
.
println
();
}
}
/**
* @param x Source Vertex
* @param y End vertex
* @param z Weight
*/
public
void
addEdge
(
int
x
,
int
y
,
int
z
)
// Adds unidirectional edge
{
edges
[
index
++] =
new
Edge
(
x
,
y
,
z
);
}
public
Edge
[]
getEdgeArray
() {
return
edges
;
}
}
Back
|
FazBrowse Home
|
New Git URL