【模板】最小生成樹 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...