題目:
最小生成樹演算法(prim演算法講得好):
這篇kruskal演算法講得更清楚 :
1、prim演算法
1).輸入:乙個加權連通圖,其中頂點集合為v,邊集合為e;
2).初始化:vnew = ,其中x為集合v中的任一節點(起始點),enew = {},為空;
3).重複下列操作,直到vnew = v:
a.在集合e中選取權值最小的邊,其中u為集合vnew中的元素,而v不在vnew集合當中,並且v∈v(如果存在有多條滿足前述條件即具有相同權值的邊,則可任意選取其中之一);
b.將v加入集合vnew中,將邊加入集合enew中;
4).輸出:使用集合vnew和enew來描述所得到的最小生成樹。
//prim解
#include#includeusing namespace std;
const int qwq = 65536+10;
int size ;
const int n = 500+10;
setv;//初始結點集合
set::iterator it;
int rs;
void build(int map[n][n])
it++;
}// printf("最短的:%d->長度%d\n",k,min);1
if(rsmap[k][i])
}v.erase(k); }}
int main()
,// ,
// ,
// ,
// ,
// ,
//
// };
for(int i=0;i2、kruskal演算法描述
kruskal演算法是基於貪心的思想得到的。首先我們把所有的邊按照權值先從小到大排列,接著按照順序選取每條邊,如果這條邊的兩個端點不屬於同一集合,那麼就將它們合併,直到所有的點都屬於同乙個集合為止。至於怎麼合併到乙個集合,那麼這裡我們就可以用到乙個工具——-並查集(不知道的同學請移步:here)。換而言之,kruskal演算法就是基於並查集的貪心演算法。
//kruskal 把邊按權值從小到大排序,從小到大 遍歷每一條邊, 如果邊的兩個端點不再同乙個聯通分支中,就連線起來
#include#include#includeusing namespace std;
struct node
;//int cmp(node a,node b)
//{// return a.wei
POJ 2458 解題報告
剛開始用的是quick select選取第n 1小的邊,感覺挺有道理的,沒有意識到前n 1小的邊可能會構成環。所以這道題還是要求最小生成樹,然後裡面的邊就保證能夠將所有的點都連線起來。最小生成樹裡面最大的那條邊即為所求。2485 accepted 788k 235ms c 2953b id thes...
poj 2485 Highways 最小生成樹
題目大意 給出1 n的城鎮,現在需要修一條高速公路,使得任意城鎮可以互相來往 轉換之後就成了求最小生成樹中最長的邊 解題思路 input的是鄰接矩陣,直接用 prim 演算法 include include define max 501 define inf 0x3f3f3f3f int t,n,n...
POJ 1751 Highways 最小生成樹
題意 給你n個村莊的座標,然後再給你m行,每行的兩個數字代表公路兩端的村莊編號 1 n 問在花費最少的情況下還需建哪些路才能使所有村莊連通。思路 kruskal的話思路很明確,先建好邊集,然後將每條已經建好的路執行合併操作,即add a,b 然後再用kruskal輸出一遍每次建邊的兩個村莊編號就ok...