题目链接:http://poj.org/problem?id=1287
题意:给你点边距离求最小生成树
思路:完全的一个模板题
代码:
#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <numeric>
#include <set>
#include <string>
#include <cctype>
#include <sstream>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
typedef pair<int, int> P;
const int maxn = 5e5 + 5;
int n,m,p[55];
struct edge{
int u,v,cost;
}e[maxn];
bool cmp(edge a,edge b){
return a.cost<b.cost;
}
void init (int n) {for (int i=1;i<=n;i++) p[i]=i;}
int Find(int x) {return p[x]==x?x: ( p[x]=Find ( p[x] ) );}
bool same(int a,int b) {return Find(a)==Find(b);}
void unite (int x,int y)
{
x=Find(x);
y=Find(y);
if (x!=y) p[x]=y;
}
int kruskal(){
sort(e,e+m,cmp);
init(n);
int ans=0;
for (int i=0;i<m;i++){
edge ee=e[i];
if (!same(ee.u,ee.v)){
unite(ee.u,ee.v);
ans+=ee.cost;
}
}
return ans;
}
int main () {
//freopen ("in.txt", "r", stdin);
while (~scanf ("%d%d",&n,&m)&&n){
memset(e,0,sizeof(e));
for (int i=0;i<m;i++){
int u,v,c;
scanf ("%d%d%d",&u,&v,&c);
e[i].u=u;
e[i].v=v;
e[i].cost=c;
}
printf ("%d\n",kruskal());
}
return 0;
}