人山人海(python實現)
阿新 • • 發佈:2021-02-03
人山人海(通訊網理論基礎)
小朱和小白同學來到大學旁的商圈鳳巢玩耍。商圈中有n個娛樂場館和m條路連線這些場館。由於國慶期間出門玩耍的人數增加,每條路上都積攢了不同數量的遊客。小朱同學不想經過遊客太多的路徑,所以求助成都某大學精通圖演算法的小白同學。問,任意兩個場館之間最大遊客數量最小的那條路的最大遊客數量。
如圖:
a-g兩點間的路徑,只有a-c-f-d-g這條路的最大遊客數量是最小的,為80。
b-d兩點間的路徑,只有b-a-c-f-d這條路的最大遊客數量是最小的,為80。
輸入:第一行m<10000為圖的邊數,第二行為圖的點數。之後m<100行,每行有三個正整數I,j,k表示節點I,j相連,遊客人數k<10000。之後一行一個正整數t<n(n-1)表示詢問次數。之後t行,每一行兩個正整數a,b(a,b<n),表示詢問a,b之間最大遊客數量最小的那條路的最大遊客數量。
對於每次詢問輸出一行,該行為一個正整數,表示最大遊客數量。
樣例:
輸入:
5
4
1 2 10
1 3 20
2 3 15
2 4 5
3 4 30
1
04
輸出:
10
題目分析:
這個題目的思路和溫差問題有些相似,先將圖中所有的邊按權重從小到大排列,從排列好的邊集合A依次取出邊加入一個新的集合B,每加入一條邊都要判斷給定的起點終點在集合B中的邊與邊對應的點構成的圖裡是否可達,如果可達就停止加邊,將集合B中最大的邊權值輸出。
import sys, time, math
edgeLinks = dict()
edgeLinks_dfs = dict()
stack = []
edgeWeightsAbout = dict()
edgeWeightsAbout1 = dict()
edgeWeight = dict()
Cu = []
J = []
S = []
Path = []
start = []
end = []
stack = []
T = []
Q = []
ju = 0
start_1 = time.time()
def DFS(start, end):
global stack, T, edgeLinks_dfs, p, ju
stack.append(start)
if start == end:
p = 1
ju = 1
# print("找到路徑:%s" %(stack))
stack.clear()
else:
if len(edgeLinks_dfs) != 0:
if start in edgeLinks_dfs:
for nextPoint in edgeLinks_dfs[start]: # start不為全域性變數 在遞迴後就變為了nextPoint
if nextPoint not in stack:
DFS(nextPoint, end)
if p == 1:
stack.clear()
return
else:
p = -1
stack.pop()
global p
p = 0
f = open('data5.txt', 'r')
P = int(f.readline())
V = int(f.readline())
if V > 1 and V <= 10000 and P <= 10000:
for item2 in range(P):
a, b, c = map(int, f.readline().split())
wi = int(c)
if str(a) not in edgeLinks: edgeLinks[str(a)] = set()
if str(b) not in edgeLinks: edgeLinks[str(b)] = set()
edgeLinks[str(a)].add(str(b))
edgeLinks[str(b)].add(str(a))
# 進行權重分類 權重一樣的放到一個集合裡面
if wi not in edgeWeightsAbout.keys():
edgeWeightsAbout[wi] = []
if {str(a), str(b)} not in edgeWeightsAbout[wi]:
edgeWeightsAbout[wi].append({str(a), str(b)})
if str(a) not in edgeWeight:
edgeWeight[str(a)] = dict()
if str(b) not in edgeWeight:
edgeWeight[str(b)] = dict()
edgeWeight[str(a)].update({str(b): c})
edgeWeight[str(b)].update({str(a): c})
NP = int(f.readline())
for item3 in range(NP):
m, n = map(int, f.readline().split())
start.append(str(m))
end.append(str(n))
S = sorted(edgeWeightsAbout.keys(), reverse=False)
for item6 in range(len(S)):
edgeWeightsAbout1.update({S[item6]: edgeWeightsAbout[S[item6]]})
for item12 in range(NP):
T.clear()
Cu.clear()
J.clear()
edgeLinks_dfs.clear()
stack.clear()
ju = 0
for item7 in range(len(S)):
if(ju==1):
break
for item8 in range(len(edgeWeightsAbout1[S[item7]])):
if(ju==1):
break
for item11 in edgeWeightsAbout1[S[item7]][item8]:
J.append(item11)
if J[0] not in edgeLinks_dfs: edgeLinks_dfs[J[0]] = set()
if J[1] not in edgeLinks_dfs: edgeLinks_dfs[J[1]] = set()
edgeLinks_dfs[J[0]].add(J[1])
edgeLinks_dfs[J[1]].add(J[0])
Cu.append(str(J[0]))
Cu.append(str(J[1]))
J.clear()
if (len(edgeLinks_dfs) == 0):
break
else:
if (len(edgeLinks_dfs) == 0):
break
else:
if start[item12] in Cu and end[item12] in Cu:
DFS(start[item12], end[item12])
if (p == 1):
T.append(edgeWeight[Cu[len(Cu) - 2]][Cu[len(Cu) - 1]])
if (ju == 1):
print('%s->%s'%(start[item12],end[item12]),end=' ')
print(T)
else:
print('no path')
end_1 = time.time()
print('Running time: %s Seconds' % (end_1 - start_1))
該程式碼採取讀取檔案形式,只需將檔案路徑放入即可。
輸出:為起點->終點 最大遊客數量
輸出為“no path”意味著沒有該路徑
正常輸出如下:
1->10 [10]
1->13 [10]
2->25 [13]
45->70 [11]
8->89 [8]
Running time: 0.009997129440307617 Seconds