並查集及其簡單應用:優化kruskal演算法
阿新 • • 發佈:2019-01-07
並查集是一種可以在較短的時間內進行集合的查詢與合併的樹形資料結構
每次合併只需將兩棵樹的根合併即可
通過路徑壓縮減小每顆樹的深度可以使查詢祖先的速度加快不少
程式碼如下:
int getfather(int x) //查詢祖先 { if(father[x]!=x) father[x]=getfather(father[x]); //路徑壓縮,把每個節點的父親都變得與他的祖先相同 else return x; return father[x]; } int issame(int x,int y) //是否在同一個集合 { return getfather(x)==getfather(y); } void set_union(int x,int y) //合併 { int fx,fy; fx=getfather(x); fy=getfather(y); father[fx]=fy; }
並查集優化克魯斯卡爾演算法:
for(i=1;i<=n;i++)
father[i]=i;
qsort(e,k,sizeof(ed),cmp);
ans=0;
for(i=0;i<k;i++)
{
if(issame(e[i].l,e[i].r)) //跳過已在生成樹中的邊
continue;
ans+=e[i].weight;
set_union(e[i].l,e[i].r);
}