Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 6819 | Accepted: 3719 |
Description
Your task is to design the network for the area, so that there is a connection (direct or indirect) between every two points (i.e., all the points are interconnected, but not necessarily by a direct cable), and that the total length of the used cable is minimal.
Input
The maximal number of points is 50. The maximal length of a given route is 100. The number of possible routes is unlimited. The nodes are identified with integers between 1 and P (inclusive). The routes between two points i and j may be given as i j or as j i.
Output
Sample Input
1 0 2 3 1 2 37 2 1 17 1 2 68 3 7 1 2 19 2 3 11 3 1 7 1 3 5 2 3 89 3 1 91 1 2 32 5 7 1 2 5 2 3 7 2 4 8 4 5 11 3 5 10 1 5 6 4 2 12 0
Sample Output
0 17 16 26
<strong>#include<iostream>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
#define LL __int64
LL a[112010],b[112010],w[112010],xu[112010],fu[111008];
bool cmp(LL a,LL b)
{
return w[a]<w[b];
}
LL findfa(LL x)
{
return x==fu[x]? x: fu[x]=findfa(fu[x]);
}
int main()
{
LL n,m;
while(~scanf("%I64d",&m))
{
if(m==0 ) break;
scanf("%I64d",&n);
for(LL i=0;i<n;i++)
{
scanf("%I64d%I64d%I64d",&a[i],&b[i],&w[i]);
xu[i]=i;
}
sort(xu,xu+n,cmp);
for(LL i=1;i<=m;i++)
fu[i]=i;
LL sum=0;
for(LL i=0;i<n;i++)
{
LL newa=findfa(a[xu[i]]);
LL newb=findfa(b[xu[i]]);
if(newa!=newb)
{
fu[newa]=newb;
sum+=w[xu[i]];
}
}
printf("%I64d\n",sum);
}
}
</strong>