-
Notifications
You must be signed in to change notification settings - Fork 0
/
q3.py
99 lines (88 loc) · 4.1 KB
/
q3.py
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
# def count_edges_not_in_shortest_paths(n, edges):
# # ایجاد یک دیکشنری برای نگهداری تعداد یالهایی که در کوتاهترین مسیر بین دو راس حضور ندارند
# edge_counts = {}
#
# # ایجاد ماتریس فاصله برای ذخیره کوتاهترین فاصله بین هر جفت راس
# distances = [[float('inf')] * n for _ in range(n)]
#
# # پر کردن ماتریس فاصله براساس یالها
# for u, v, w in edges:
# distances[u - 1][v - 1] = w
# distances[v - 1][u - 1] = w
#
# # الگوریتم فلوید وارشال برای محاسبه کوتاهترین مسیرها
# for k in range(n):
# for i in range(n):
# for j in range(n):
# distances[i][j] = min(distances[i][j], distances[i][k] + distances[k][j])
#
# # بررسی هر یال
# for u, v, w in edges:
# count = 0
# # بررسی تمام جفتهای راسها
# for i in range(n):
# for j in range(n):
# # اگر یال در کوتاهترین مسیر بین دو راس حضور نداشته باشد
# if distances[i][j] == distances[i][u - 1] + w + distances[v - 1][j]:
# count += 1
# edge_counts[(u, v)] = count
#
# # شمارش یالهایی که در هیچ کوتاهترین مسیری حضور ندارند
# result = sum(1 for count in edge_counts.values() if count == n - 2)
# return result
#
#
# # خواندن ورودی
# n, m = map(int, input().split())
# edges = []
# for _ in range(m):
# A, B, C = map(int, input().split())
# edges.append((A, B, C))
#
# # محاسبه و چاپ تعداد یالهایی که در هیچ کوتاهترین مسیری حضور ندارند
# print(count_edges_not_in_shortest_paths(n, edges))
def count_edges_not_in_shortest_paths(n, edges):
# ایجاد یک دیکشنری برای نگهداری تعداد یالهایی که در کوتاهترین مسیر بین دو راس حضور ندارند
edge_counts = {}
# ایجاد ماتریس فاصله برای ذخیره کوتاهترین فاصله بین هر جفت راس
distances = [[float('inf')] * n for _ in range(n)]
# پر کردن ماتریس فاصله براساس یالها
for u, v, w in edges:
distances[u - 1][v - 1] = w
distances[v - 1][u - 1] = w
# چاپ ماتریس فاصله برای بررسی درستی محاسبات
print("Initial Distance Matrix:")
for row in distances:
print(row)
print()
# الگوریتم فلوید وارشال برای محاسبه کوتاهترین مسیرها
for k in range(n):
for i in range(n):
for j in range(n):
distances[i][j] = min(distances[i][j], distances[i][k] + distances[k][j])
# چاپ ماتریس فاصله بعد از اعمال الگوریتم فلوید وارشال
print("Distance Matrix After Floyd-Warshall Algorithm:")
for row in distances:
print(row)
print()
# بررسی هر یال
for u, v, w in edges:
count = 0
# بررسی تمام جفتهای راسها
for i in range(n):
for j in range(n):
# اگر یال در کوتاهترین مسیر بین دو راس حضور نداشته باشد
if distances[i][j] == distances[i][u - 1] + w + distances[v - 1][j]:
count += 1
edge_counts[(u, v)] = count
# شمارش یالهایی که در هیچ کوتاهترین مسیری حضور ندارند
result = sum(1 for count in edge_counts.values() if count == n - 2)
return result
# خواندن ورودی
n, m = map(int, input().split())
edges = []
for _ in range(m):
A, B, C = map(int, input().split())
edges.append((A, B, C))
# محاسبه و چاپ تعداد یالهایی که در هیچ کوتاهترین مسیری حضور ندارند
print(count_edges_not_in_shortest_paths(n, edges))