long long kruskal()
{
long long MinCost=0;
int i=0;
while(i<tn)
{
if(!same(edge[i].s,edge[i].e))
{
_union(edge[i].s,edge[i].e);
MinCost+=edge[i].w;
}
++i;
}
if(group!=1)return -1;
return MinCost;
}
int main()
{
int d,e,s,n,w;
while(~scanf("%d%d",&d,&e))
{
tn=e;
init(d);
for(int a=0;a<e;a++)
{
scanf("%d%d%d",&edge[a].s,&edge[a].e,&edge[a].w);
}
sort(edge,edge+e);
printf("%lld\n",kruskal());
}
return 0;
}
有點失敗的解法,一年級研究的,足足比上面慢了快20%
/**********************************************************************************/
/* Problem: a129 "最小生成樹" from */
/* Language: CPP (1183 Bytes) */
/* Result: AC(0.7s, 6.1MB) judge by this@ZeroJudge */
/* Author: lfs92002 at 2013-03-16 23:09:18 */
/**********************************************************************************/
#include<queue>
#include<string.h>
#include<cstdio>
#include<iostream>
using namespace std;
int uni_data[100000];
int group;
void init(int size)
{
for(int a=0;a<size;a++)uni_data[a]=a;
group=size;
}
int find(int n)
{
if(uni_data[n]==n)return n;
uni_data[n]=find(uni_data[n]);
return uni_data[n];
}
int same(int a,int b)
{
return find(a)==find(b);
}
int _union(int a,int b)
{
uni_data[find(b)]=find(a);
group--;
}