prim演算法 標準版與堆優化(python實現)

2021-10-19 16:10:00 字數 2336 閱讀 6727

【模板】最小生成樹 prim演算法

這道題目主要是考驗我們對prim演算法的熟練程度,prim演算法的主要思想就是找乙個起始點,就是一直尋找乙個最小邊,當新增了m-1條邊後停止新增,然後輸出總和.

code:

n,m =

map(

int,

input()

.split())

flag =[0

for i in

range

(n+1)]

graphx =[0

for i in

range

(m+1)]

#儲存鄰接矩陣

graphy =[0

for i in

range

(m+1)]

weight =[0

for i in

range

(m+1)]

for i in

range

(m):

x,y,z =

map(

int,

input()

.split())

graphx[i]

= x graphy[i]

= y weight[i]

= zflag[1]

=1#1作為預設起始點

sumvalue=

0m =

0#已經找到了m條邊邊

while m#總共尋找n-1條邊

minvalue =

float

('inf'

)#定義為

for i in

range

(m):

#可進行堆優化的地方

if(minvalue > weight[i]):

if((flag[graphx[i]

]+ flag[graphy[i]]==

1)):

minvalue = weight[i]

min_index = i

if(minvalue ==

float

('inf'))

:continue

sumvalue +=minvalue #權重總和

flag[graphx[min_index]

]=flag[graphy[min_index]]=

1#標記為以遍歷過

m+=1print

(sumvalue)

#建立乙個flag

堆優化

主要是在尋找最小邊的過程中進行優化,構造乙個最小堆進行每條邊長度的排序,然後逐一檢查是不是邊的兩邊都已經遍歷過,下面是**: 複雜度為o(lognn)

code:

import heapq

from collections import defaultdict

n,m =

map(

int,

input()

.split())

flag =[0

for i in

range

(n+1)]

graph =

dict1=defaultdict(

list

)for i in

range

(m):

x,y,z =

map(

int,

input()

.split())

dict1[x]

(y,z)

) dict1[y]

(x,z)

)flag[1]

=1#預設以1作為起始點

for i in dict1[1]

:[i[1]

,1, i[0]

])# 逐步加入邊.

sumvalue=

0m =

1while m#取出最小值

if(flag[start]

+flag[end]!=1

):#需要乙個點已經遍歷而另乙個點沒有遍歷

continue

for i in dict1[end]

:[i[1]

, end, i[0]

])# 逐步加入邊.

sumvalue += weight

flag[start]=1

flag[end]=1

m+=1print

(sumvalue)

#最小生成樹的總值

#建立乙個flag

不知道為啥python就是過不了,可能是本身語言的原因吧,哭了哭了

P4779單源最短路徑(標準版)

應用的是dijkstra演算法,這種演算法的思想類似於貪心。首先,將所有點分為已知最短路和未知最短路兩類。開始時,只有出發點的最短路已知,為0,其餘點都標記為正無窮。我們要求出出發點到所有點的最短路徑,因此進行點數輪迴圈,每輪迴圈中,遍歷與已知點間有邊相連的點,更新與出發點的最短路徑。然後從所有更新...

P4779 模板 單源最短路徑(標準版)

最短路 堆優化 dijkstra 優先佇列 複雜度 o eloge 洛谷4779 題目描述 給定乙個 n 個點,m 條有向邊的帶非負權圖,請你計算從 s 出發,到每個點的距離。資料保證能從 s 出發到任意點 輸入4 6 1 1 2 2 2 3 2 2 4 1 1 3 5 3 4 3 1 4 4 輸出...

P4779 模板 單源最短路徑(標準版)

題目入口 p4779 模板 單源最短路徑 標準版 使用 堆優化dijkstra求最短路 模版 使用模版前言 注意頂點數maxn的值 注意極大資料inf的值 include include include include include include include define maxn 3000...