題意:給n個點,m條邊,和每條邊的權值,求從s點到e點 路徑 權差 的最小值,即邊權值最大的減去最小的。
原始最小生成樹可以做的:求連線圖所有節點 的最小權值和。
kruskal演算法使用的結構:並查集,對邊權排序。
kruskal演算法的實現過程:
1:輸入邊,權
2:對權 從小到大 排序
3:按權值 從小到大考慮 ,
是否可以連線這條邊(成環則不可連,不成環可連)
判斷成環與否和連線 環的操作使用並查集實現 :
若該邊的兩個節點都在同乙個並查集枝上,則成環
連線 就是用並查集連線
就本題來說:
目的:求從s點到e點 路徑 權差 的最小值
kruskal演算法的操作:按權值從小到大連邊,那麼s和e連線完畢時的邊權時最大的權,起始的邊權時最小的,起始邊權從所有邊權最小開始
在可以連通s和e的前提下,第乙個連線的邊權 應盡量 大 , 最後連線的邊權盡量 小
判斷s和e連通的標誌: 它們的老大是同一人
關鍵**:
void ckruskal()e[1005];8
int n,m,q,k,s,en,fin,pre[205];9
bool
flag;
10bool cmp(edge a,edge b)
1112
void
input()
1318
19int f(int x)
2021
void
ckruskal()
2234}35
if(!flag) break
;36 fin=min(e[k].w-e[i].w,fin);37}
38}39int
main()
405253}
54return0;
55 }
view code
hdu 1598 列舉 最小生成樹
本題要求一條通路中,最高速與最低速的差值最小。這樣的題與求最小生成樹的題的求法完全不一樣了。為了保證通路中差值最小,應先對權值從小到大排序,然後遍歷所有的點進行查詢。起點的位置逐漸變大 保證每個點都遍歷 而只要所求的兩點連通,立刻break,以保證差值最小。include stdio.h inclu...
貪心 最小生成樹Kruskal演算法
構造最小生成樹還有一種演算法,kurskal演算法 設g v,e 是無向連通帶權圖,v 設最小生成樹t v,te 該樹的初始狀態為只有n個頂點而無邊的非連通圖t v,kruskal演算法將這n個頂點看成是n個孤立的連通分支。它首先將所有的邊按權值從小到大排序,然後只要t中選中的邊數不到n 1,就做如...
hdu 1863 最小生成樹
使用並查集,陣列不要太小 include stdio.h int set 200 int n,m typedef struct nodenode,pnode node road 200 void init int find int u return set u int join int u,int ...