輸入包含多組數據,格式如下。 第一行包括兩個整數n m,代表城市個數和可以修建的公路個數。(n <= 100, m <=10000) 剩下m行每行3個非負整數a b c,代表城市a 和城市b之間可以修建一條公路,代價為c(城市編號從1到n)。
Output
每組輸出占一行,僅輸出最小花費。 Sample Input
3212113110
Output
2 0
//Prim#include<bits/stdc++.h>usingnamespace std;#define INF 0x3f3f3f3fconstint N =200;int mp[N][N];int book[N];intPrim(int n){int dist[N];int sum =0;//最終花費for(int i =1; i <= n; i++){dist[i]= mp[1][i];//dist數組表示從1這個點開始,到其余各點的權值}book[1]=1;//1這個點在開始時加入最小生成樹,不進入接下來的循環(huán)int minn, u;for(int i =1; i < n; i++){minn = INF;u =0;for(int j =1; j <= n; j++){if(!book[j]&& dist[j]< minn)//找到生成樹的下一個點{minn = dist[j];u = j;}}book[u]=1;sum += minn;for(int v =1; v <= n; v++)//在加入u這個新點之后更新dist數組的值{if(!book[v]&& dist[v]> mp[u][v]){dist[v]= mp[u][v];}}}return sum;}intmain(){int n, m, u, v, len;while(cin >> n >> m){memset(book,0,sizeof(book));memset(mp, INF,sizeof(mp));for(int i =1; i <= n; i++){mp[i][i]=0;}while(m--){cin >> u >> v >> len;if(len < mp[u][v])//這個非常重要mp[u][v]= mp[v][u]= len;}cout <<Prim(n)<< endl;}}//Kruskal#include<bits/stdc++.h>usingnamespace std;constint N =110, M =1e4+10;int Next[N];struct node
{int u, v, len;} edge[M];intcmp(node a, node b){return a.len < b.len;}voidinit(int n)//并查集初始化{for(int i =1; i <= n; i++)Next[i]= i;}intfind_root(int i)//查找根節(jié)點{if(Next[i]== i)return Next[i];else{Next[i]=find_root(Next[i]);return Next[i];}}intmerage(int u,int v){int t1 =find_root(u), t2 =find_root(v);if(t1 != t2){Next[t1]= Next[t2];return1;}elsereturn0;}intmain(){int n, m;while(cin >> n >> m){int sum =0;init(n);for(int i =1; i <= m; i++)cin >> edge[i].u >> edge[i].v >> edge[i].len;sort(edge +1, edge +1+ m, cmp);for(int i =1; i <= m; i++){if(merage(edge[i].u, edge[i].v))sum += edge[i].len;}cout << sum << endl;}return0;}