Skip to content

Commit 84c013a

Browse files
committed
add
1 parent 259bc0f commit 84c013a

14 files changed

Lines changed: 255 additions & 2 deletions

File tree

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
infinity = float('inf')
2+
3+
def reverse_graph(G):
4+
n = len(G)
5+
G_rev = [[] for v in range(n)]
6+
for u in range(n):
7+
for v, weight in G[u]:
8+
G_rev[v].append((u, weight))
9+
return G_rev
10+
11+
def bellman_ford(G_in, s):
12+
n = len(G_in)
13+
dist = [infinity] * n; dist[s] = 0
14+
prev = [None] * n
15+
16+
for _ in range(n-1):
17+
dist_new = [None] * n; dist_new[s] = 0
18+
prev_new = [None] * n
19+
for v in range(n):
20+
if v == s:
21+
continue
22+
dist_new[v] = dist[v]
23+
prev_new[v] = prev[v]
24+
for u, weight in G_in[v]:
25+
if dist[u] + weight < dist_new[v]:
26+
dist_new[v] = dist[u] + weight
27+
prev_new[v] = u
28+
dist = dist_new
29+
prev = prev_new
30+
31+
return dist, prev
32+
33+
n, m = map(int, input().split())
34+
G = [[] for _ in range(n)]
35+
for i in range(m):
36+
u, v, weight = map(int, input().split())
37+
G[u].append((v, weight))
38+
s = int(input())
39+
40+
G_in = reverse_graph(G)
41+
42+
MEASURE_START()
43+
dist, prev = bellman_ford(G_in, s)
44+
MEASURE_STOP()
45+
46+
print("Shortest paths:"); print(dist); print()
47+
print("Parents for the shortest paths:"); print(prev); print()
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import random
2+
rng = random.Random(42)
3+
4+
# Erdős-Rényi directed graph generator (positive weights)
5+
def generate_graph(n, p):
6+
edges = []
7+
for u in range(n):
8+
for v in range(n):
9+
if u != v and rng.random() < p:
10+
weight = rng.randint(1, 50)
11+
edges.append((u, v, weight))
12+
return edges
13+
14+
p = 0.2
15+
sizes = [(i+1)*100 for i in range(5)]
16+
17+
for n in sizes:
18+
edges = generate_graph(n, p)
19+
m = len(edges)
20+
lines = [f"{n} {m}"]
21+
for u, v, weight in edges:
22+
lines.append(f"{u} {v} {weight}")
23+
lines.append(f"0")
24+
INPUT("\n".join(lines))
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import random
2+
rng = random.Random(42)
3+
4+
# Erdős-Rényi directed graph generator (positive weights)
5+
def generate_graph(n, p):
6+
edges = []
7+
for u in range(n):
8+
for v in range(n):
9+
if u != v and rng.random() < p:
10+
weight = rng.randint(1, 50)
11+
edges.append((u, v, weight))
12+
return edges
13+
14+
p = 0.8
15+
sizes = [(i+1)*100 for i in range(5)]
16+
17+
for n in sizes:
18+
edges = generate_graph(n, p)
19+
m = len(edges)
20+
lines = [f"{n} {m}"]
21+
for u, v, weight in edges:
22+
lines.append(f"{u} {v} {weight}")
23+
lines.append(f"0")
24+
INPUT("\n".join(lines))

‎src/lib/code/en/bf/input.txt‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
5 8
2+
0 1 6
3+
0 3 7
4+
1 2 5
5+
1 3 8
6+
1 4 -4
7+
2 1 -2
8+
3 2 -3
9+
3 4 9
10+
0
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
vegtelen = float('inf')
2+
3+
def grafot_megfordit(G):
4+
n = len(G)
5+
G_ford = [[] for v in range(n)]
6+
for u in range(n):
7+
for v, suly in G[u]:
8+
G_ford[v].append((u, suly))
9+
return G_ford
10+
11+
def bellman_ford(G_be, s):
12+
n = len(G_be)
13+
tav = [vegtelen] * n; tav[s] = 0
14+
elozo = [None] * n
15+
16+
for _ in range(n-1):
17+
tav_uj = [None] * n; tav_uj[s] = 0
18+
elozo_uj = [None] * n
19+
for v in range(n):
20+
if v == s:
21+
continue
22+
tav_uj[v] = tav[v]
23+
elozo_uj[v] = elozo[v]
24+
for u, suly in G_be[v]:
25+
if tav[u] + suly < tav_uj[v]:
26+
tav_uj[v] = tav[u] + suly
27+
elozo_uj[v] = u
28+
tav = tav_uj
29+
elozo = elozo_uj
30+
31+
return tav, elozo
32+
33+
n, m = map(int, input().split())
34+
G = [[] for _ in range(n)]
35+
for i in range(m):
36+
u, v, suly = map(int, input().split())
37+
G[u].append((v, suly))
38+
s = int(input())
39+
40+
G_be = grafot_megfordit(G)
41+
42+
MERES_KEZD()
43+
tav, elozo = bellman_ford(G_be, s)
44+
MERES_VEG()
45+
46+
print("Legrövidebb utak:"); print(tav); print()
47+
print("Legrövidebb utak szülői:"); print(elozo); print()
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import random
2+
rng = random.Random(42)
3+
4+
# Erdős-Rényi irányított gráf generátor (pozitív súlyok)
5+
def generate_graph(n, p):
6+
edges = []
7+
for u in range(n):
8+
for v in range(n):
9+
if u != v and rng.random() < p:
10+
weight = rng.randint(1, 50)
11+
edges.append((u, v, weight))
12+
return edges
13+
14+
p = 0.2
15+
sizes = [(i+1)*100 for i in range(5)]
16+
17+
for n in sizes:
18+
edges = generate_graph(n, p)
19+
m = len(edges)
20+
lines = [f"{n} {m}"]
21+
for u, v, weight in edges:
22+
lines.append(f"{u} {v} {weight}")
23+
lines.append(f"0")
24+
BEMENET("\n".join(lines))
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import random
2+
rng = random.Random(42)
3+
4+
# Erdős-Rényi irányított gráf generátor (pozitív súlyok)
5+
def generate_graph(n, p):
6+
edges = []
7+
for u in range(n):
8+
for v in range(n):
9+
if u != v and rng.random() < p:
10+
weight = rng.randint(1, 50)
11+
edges.append((u, v, weight))
12+
return edges
13+
14+
p = 0.8
15+
sizes = [(i+1)*100 for i in range(5)]
16+
17+
for n in sizes:
18+
edges = generate_graph(n, p)
19+
m = len(edges)
20+
lines = [f"{n} {m}"]
21+
for u, v, weight in edges:
22+
lines.append(f"{u} {v} {weight}")
23+
lines.append(f"0")
24+
BEMENET("\n".join(lines))

‎src/lib/code/hu/bf/input.txt‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
5 8
2+
0 1 6
3+
0 3 7
4+
1 2 5
5+
1 3 8
6+
1 4 -4
7+
2 1 -2
8+
3 2 -3
9+
3 4 9
10+
0

‎src/lib/code/load-code.js‎

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,18 @@ function loadHu() {
9797
"input": {
9898
"input.txt": { content: file("hu", "dijkstra/input.txt") },
9999
}
100+
},
101+
bf: {
102+
"algo": {
103+
"bellman_ford.py": { content: file("hu", "bf/algo/bellman_ford.py") },
104+
},
105+
"generator": {
106+
"erdos_renyi_0.2.py": { content: file("hu", "bf/generator/erdos_renyi_0.2.py") },
107+
"erdos_renyi_0.8.py": { content: file("hu", "bf/generator/erdos_renyi_0.8.py") },
108+
},
109+
"input": {
110+
"input.txt": { content: file("hu", "bf/input.txt") },
111+
}
100112
}
101113
};
102114
}
@@ -186,12 +198,24 @@ function loadEn() {
186198
"input": {
187199
"input.txt": { content: file("en", "dijkstra/input.txt") },
188200
}
201+
},
202+
bf: {
203+
"algo": {
204+
"bellman_ford.py": { content: file("en", "bf/algo/bellman_ford.py") },
205+
},
206+
"generator": {
207+
"erdos_renyi_0.2.py": { content: file("en", "bf/generator/erdos_renyi_0.2.py") },
208+
"erdos_renyi_0.8.py": { content: file("en", "bf/generator/erdos_renyi_0.8.py") },
209+
},
210+
"input": {
211+
"input.txt": { content: file("en", "bf/input.txt") },
212+
}
189213
}
190214
};
191215
}
192216

193217
export function loadDefaultCode() {
194-
return { version: 29, pages: { hu: loadHu(), en: loadEn() } };
218+
return { version: 30, pages: { hu: loadHu(), en: loadEn() } };
195219
}
196220

197221
export const defaultCode = loadDefaultCode();

‎src/lib/locales/en.json‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@
7070
"dijkstra": {
7171
"title": "Dijkstra's algorithm",
7272
"desc": "Single-source shortest paths in directed graphs with non-negative edge weights."
73+
},
74+
"bf": {
75+
"title": "Bellman-Ford algorithm",
76+
"desc": "Single-source shortest paths in directed graphs, allowing negative edge weights but no negative cycles."
7377
}
7478
}
7579
}

0 commit comments

Comments
 (0)