1. 程式人生 > 其它 >人山人海(python實現)

人山人海(python實現)

技術標籤:程式碼python演算法kruskal圖論

人山人海(通訊網理論基礎)

小朱和小白同學來到大學旁的商圈鳳巢玩耍。商圈中有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