国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[華為OD] 最小傳輸時延(dijkstra算法)

這篇具有很好參考價值的文章主要介紹了[華為OD] 最小傳輸時延(dijkstra算法)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

明天就要面試了我也太緊張了吧

但是終于找到了一個比較好理解的dijkstra的python解法,讓我快點把它背下來!?。。?/p>

題目

先把題目放出來

某通信網(wǎng)絡中有N個網(wǎng)絡結(jié)點,用1到N進行標識。網(wǎng)絡通過一個有向無環(huán)圖表示,其中題的邊的值表示結(jié)點之間的消息傳遞時延。現(xiàn)給定相連節(jié)點之間的時延列表 times[i] = {u,v,w},其中u表示源節(jié)點,v表示目的節(jié)點,w表示u和v之間的消息傳遞時延。
請計算給定源結(jié)點到目的結(jié)點的最小傳輸時延,如果目的結(jié)點不可達,返回-1。

輸入描述:
輸入的第一行為兩個正整數(shù),分別表示網(wǎng)絡結(jié)點的個數(shù)N以及時延列表長度M,用空格分隔。
接下來的M行為兩個結(jié)點間的時延列表[u,v,w]
輸入的最后一行為兩個正整數(shù),分別表示源結(jié)點和目的結(jié)點。

比如:

輸入 3 3
1 2 11
2 3 13
1 3 50
1 3
輸出 24

一個有向無環(huán)圖,用dfs也很好做。這里我們重點看一下dijkstra怎么做。

dijkstra算法的python實現(xiàn)

最短路徑算法Dijkstra,主要思想是貪心。每次遍歷到始點距離最近且未訪問過的頂點的鄰接節(jié)點,直到擴展到終點為止。
更具體地來說:
假設我們現(xiàn)在在一個有權(quán)圖中,圖中有n個點,點與點相連的路徑上都分配有權(quán)重,代表了兩點之間的距離。現(xiàn)在有一個起始點i,終點j,如果求i到j的最短距離。

  1. 我們建立一個集合s,把起始點i放進去,然后在與i相鄰的邊中尋找與i距離最近的點,并把這個點放到集合中去。
  2. 然后第二次遍歷與集合中的點相連的點,并更新到起始點的距離,并把距離起始點i最近的點放到集合中去。
  3. 繼續(xù)上面的做法,每次都在集合中添加一個點。直到?jīng)]有新的點可以添加進去。

我們來寫一個比較簡單的python實現(xiàn)。
假設現(xiàn)在有n個節(jié)點,同時有一個輸入distance距離列表,里面的元素表示的是[u,v,w]即u到v的距離?,F(xiàn)在給定起點k,求k到最遠的點的最小距離

dist = [float('inf')]*n # 構(gòu)建一個列表存放n個結(jié)點到目標k的距離
dist[k-1] = 0  # 第k個結(jié)點到他本身的距離為0

g = [[float('inf')] * n for _ in range(n)] # 構(gòu)建一個矩陣,表示n個結(jié)點彼此的距離。
for x, y, dis in distance:
	g[x-1][y-1] = time  # 按照distance列表更新矩陣中兩兩結(jié)點的距離。

used = [False]*n # 判斷點是否已經(jīng)加入了set里面。

for _ in range(n):
	x = -1
	for y, u in enumerate(used):
		if not u and (x == -1 or dist[y] < dist[x]): #只考慮沒有使用過的節(jié)點,尋找結(jié)點們到初始點的最小距離。
		# 毫無疑問,在第一次遍歷中,這個距離是0,目標點是我們的源點本身。
			x = y  # 如果距離小,就用新的點替換掉x。
		
	used[x] = True # 每次都使用距離源點最近的點
	for y, time in enumerate(g[x]):
		dist[y] = min(dist[y], dist[x]+time)  # 更新相連的結(jié)點到源點的距離

ans = max(dist)  # 這就是我們要求的k到最遠的點的最小距離

dijkstra的時間復雜度是 O ( N 2 ) O(N^2) O(N2).

這個題也可以用dfs的方法來作,遍歷到父結(jié)點時,更新所有的子結(jié)點到源點的距離。dfs解該題的時間復雜度更高一點,是 O ( N N ) O(N^N) O(NN).
同樣給出一個解法代碼。

map_dict = defaultdict(list)
for u, v, w in distance:
	map_dict[u].append([v,w])  

dist = [float('inf')] * n
def dfs(index, dis):
	if dis < dist[index-1]:
		dist[index-1] = dis
		for v, w in map_dict[index]:
			dfs(v,dis+w)
dfs(k,0)

res = max(dist)

python解答

我們回到題目的python解答上。

dfs解法

首先我們給出一個dfs的解答。
可以看到這個解法和上面的dfs幾乎一模一樣,區(qū)別是這里返回的是源節(jié)點到目標點的距離。

def solution(times,src, dist):
    graph = {}
    for u,v, w in times:
        if u not in graph:
            graph[u] = []
        graph[u].append([v,w])
    
    root = [float('inf')]*N    
    def dfs(index, dis):
        
        if dis<root[index-1]:
            root[index-1] = dis
            if index in graph:
                for u, v in graph[index]:
                    dfs(u,dis+v)
                
    dfs(src,0)
    res = root[dist-1]
    return res if res!=float('inf') else -1
    

dijkstra解法

這個解法也是和上面的思路一樣,只不過在發(fā)現(xiàn)x==dis-1的時候,提前break結(jié)束了這個循環(huán)。文章來源地址http://www.zghlxwxcb.cn/news/detail-614754.html

def solution(times, src, dis):
    g = [[float('inf')]*N for _ in range(N)]
    for u,v, time in times:
        g[u-1][v-1] = time
        
    dist = [float('inf')]*N
    dist[src-1] = 0
    used = [False]*N
    for i in range(N):
        x = -1
        for y, u in enumerate(used):
            if not u and (x==-1 or dist[y]< dist[x]):
                x = y
        if x == dis-1:
            break
        used[x] = True
        for y, time in enumerate(g[x]):
            dist[y] = min(dist[y],dist[x]+time)
            
    return dist[dis-1]

到了這里,關(guān)于[華為OD] 最小傳輸時延(dijkstra算法)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 255.【華為OD機試】最小矩陣寬度(滑動窗口算法-Java&Python&C++&JS實現(xiàn))

    ??點擊這里可直接跳轉(zhuǎn)到本專欄,可查閱頂置最新的華為OD機試寶典~ 本專欄所有題目均包含優(yōu)質(zhì)解題思路,高質(zhì)量解題代碼(JavaPythonC++JS分別實現(xiàn)),詳細代碼講解,助你深入學習,深度掌握!

    2024年03月13日
    瀏覽(23)
  • 華為OD機試 - 求最小步數(shù)(Java & JS & Python)

    題目描述 求從坐標零點到坐標點n的最小步數(shù),一次只能沿橫坐標軸向左或向右移動 2 或 3。 注意:途徑的坐標點可以為負數(shù) 輸入描述 坐標點n 輸出描述 輸出從坐標零點移動到坐標點n的最小步數(shù) 備注 1 = n = 10^9 用例 輸入 4 輸出 2 說明 從坐標零點移動到4,最小需要兩步,即

    2024年02月13日
    瀏覽(17)
  • 華為OD機試 - 最小循環(huán)子數(shù)組(Java & JS & Python)

    題目描述 給定一個由若干整數(shù)組成的數(shù)組nums,請檢查數(shù)組是否是由某個子數(shù)組重復循環(huán)拼接而成,請輸出這個最小的子數(shù)組。 輸入描述 第一行輸入數(shù)組中元素個數(shù)n,1 ≤?n ≤ 100000 第二行輸入數(shù)組的數(shù)字序列nums,以空格分割,0 ≤ nums[i]? 10 輸出描述 輸出最小的子數(shù)組的數(shù)

    2024年02月12日
    瀏覽(27)
  • 華為OD機試 - 最小矩陣寬度(Java & JS & Python & C)

    題目描述 給定一個矩陣,包含 N * M 個整數(shù),和一個包含 K 個整數(shù)的數(shù)組。 現(xiàn)在要求在這個矩陣中找一個寬度最小的子矩陣,要求子矩陣包含數(shù)組中所有的整數(shù)。 輸入描述 第一行輸入兩個正整數(shù) N,M,表示矩陣大小。 接下來 N 行 M 列表示矩陣內(nèi)容。 下一行包含一個正整數(shù)

    2024年01月23日
    瀏覽(21)
  • 華為OD機試 - 等和子數(shù)組最小和(Java & JS & Python)

    題目描述 給定一個數(shù)組nums,將元素分為若干個組,使得每組和相等,求出滿足條件的所有分組中,組內(nèi)元素和的最小值。 輸入描述 第一行輸入 m 接著輸入m個數(shù),表示此數(shù)組nums 數(shù)據(jù)范圍:1=m=50, 1=nums[i]=50 輸出描述 最小拆分數(shù)組和 用例 輸入 7 4 3 2 3 5 2 1 輸出 5 說明 可以等分

    2024年02月04日
    瀏覽(20)
  • 華為OD機試 - 最小調(diào)整順序次數(shù)、特異性雙端隊列(Python)

    有一個特異性的雙端隊列,該隊列可以從頭部或尾部添加數(shù)據(jù),但是只能從頭部移出數(shù)據(jù)。 小A依次執(zhí)行2n個指令往隊列中添加數(shù)據(jù)和移出數(shù)據(jù)。其中n個指令是添加數(shù)據(jù)(可能從頭部添加、也可能從尾部添加),依次添加1到n;n個指令是移出數(shù)據(jù)。 現(xiàn)在要求移除數(shù)據(jù)的順序為

    2024年02月02日
    瀏覽(21)
  • 【華為OD】C卷真題 200分:最小矩陣寬度 python代碼實現(xiàn)[思路+代碼]

    C++、java、JS代碼: 【華為OD】C卷真題 200分:最小矩陣寬度 C/C++代碼實現(xiàn)[思路+代碼]-CSDN博客 【華為OD】C卷真題 200分:最小矩陣寬度 Java代碼實現(xiàn)[思路+代碼]-CSDN博客 【華為OD】C卷真題 200分:最小矩陣寬度 JavaScript代碼實現(xiàn)[思路+代碼]-CSDN博客? 給定一個矩陣,包含N*M個整數(shù),

    2024年04月17日
    瀏覽(56)
  • 華為OD機試 - 等和子數(shù)組最小和(Java & JS & Python & C & C++)

    哈嘍,本題庫完全免費,收費是為了防止被爬,大家訂閱專欄后可以私信聯(lián)系退款。感謝支持 給定一個數(shù)組nums,將元素分為若干個組,使得每組和相等,求出滿足條件的所有分組中,組內(nèi)元素和的最小值。 第一行輸入 m 接著輸入m個數(shù),表示此數(shù)組nums 數(shù)據(jù)范圍:1=m=50, 1=nu

    2024年03月27日
    瀏覽(27)
  • 【華為OD統(tǒng)一考試B卷 | 100分】求最小步數(shù)(C++ Java JavaScript Python)

    在線OJ 已購買本專欄用戶,請私信博主開通賬號,在線刷題?。?! 運行出現(xiàn) Runtime Error 0Aborted,請忽略 華為OD統(tǒng)一考試A卷+B卷 新題庫說明 2023年5月份,華為官方已經(jīng)將的 2022/0223Q(1/2/3/4)統(tǒng)一修改為OD統(tǒng)一考試(A卷)和OD統(tǒng)一考試(B卷)。 你收到的鏈接上面會標注A卷還是B卷。

    2024年02月15日
    瀏覽(20)
  • 【免費題庫】華為OD機試 - 組合出合法最小數(shù)(Java & JS & Python & C & C++)

    哈嘍,本題庫完全免費,收費是為了防止被爬,大家訂閱專欄后可以私信聯(lián)系退款。感謝支持 給一個數(shù)組,數(shù)組里面哦都是代表非負整數(shù)的字符串,將數(shù)組里所有的數(shù)值排列組合 Q 拼接起來組成一個數(shù)字,輸出拼接成的最小的數(shù)字。 個數(shù)組,數(shù)組不為空,數(shù)組里面都是代表

    2024年04月11日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包