HDU 1102
一道最小生成樹(shù)的問(wèn)題。
題目所給的輸入是按矩陣的方式輸入的,顯然這個(gè)矩陣關(guān)于主對(duì)角元對(duì)稱,所以只需要存儲(chǔ)一半的數(shù)據(jù)即可(其實(shí)少于一半,主對(duì)角元也不用存儲(chǔ))。對(duì)于輸入所給的已修好路的兩個(gè)村子,合并它們分別所在的集合(開(kāi)始的時(shí)候思維有漏洞,直接parnt[h]=l,這樣是不對(duì)的,應(yīng)該先找到它們的根進(jìn)行合并,看來(lái)自己思維的嚴(yán)密性還是很欠缺)。剩下的直接按照Kruskal算法的思路進(jìn)行即可,遇到不在同一連通集合的村子,說(shuō)明兩個(gè)村子之間需要修路。
/*將已經(jīng)修通路的村子放入一個(gè)連通集合中*/h=get_root(h);l=get_root(l);parnt[h]=l;}for(i=0;i<p;i++){if(get_root(parnt[(edge[i].a)])!=get_root(parnt[(edge[i].b)])){sum+=edge[i].v;unon(edge[i].a,edge[i].b);//修了路之后,將兩個(gè)村子放入一個(gè)連通集合}}printf("%d\n",sum);sum=0;}return 0; } int get_root(int x) {if(parnt[x]!=x){parnt[x]=get_root(parnt[x]);}return parnt[x]; } void unon(int x,int y) {x=get_root(x);y=get_root(y);if(x!=y){parnt[x]=y;} } int cmp(const void *x,const void *y) {return (*(struct edge *)x).v-(*(struct edge *)y).v; }
轉(zhuǎn)載于:https://www.cnblogs.com/coredux/archive/2012/04/19/2456235.html
總結(jié)
- 上一篇: redhat6
- 下一篇: listview移动时 item背景颜色