HDU1598最小生成樹 貪心處理

2022-05-15 13:10:58 字數 981 閱讀 9606

題意:給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 ...