轻松过了,不解释
#include <stdio.h>
#include <stdlib.h>
struct fiber{
int f1,f2;
int length;
}fiber[250000];
struct farms{
struct farms *father;
int rank;
}farms[500];
void exchange(struct fiber fiber[], int i, int j)
{
int temp;
temp=fiber[i].f1;
fiber[i].f1=fiber[j].f1;
fiber[j].f1=temp;
temp=fiber[i].f2;
fiber[i].f2=fiber[j].f2;
fiber[j].f2=temp;
temp=fiber[i].length;
fiber[i].length=fiber[j].length;
fiber[j].length=temp;
}
int partition(struct fiber fiber[], int p, int r)
{
int x;
int i,j;
x=fiber[r].length;
i=p-1;
for(j=p;j<r;j++)
{
if(fiber[j].length<=x)
{
i++;
exchange(fiber,i,j);
}
}
exchange(fiber,i+1,r);
return i+1;
}
void quicksort(struct fiber fiber[], int p, int r)
{
int q;
if(p<r)
{
q=partition(fiber,p,r);
quicksort(fiber,p,q-1);
quicksort(fiber,q+1,r);
}
}
void Make_Set(int k)
{
farms[k].father=&farms[k];
farms[k].rank=1;
}
struct farms *Find_Set(int x)
{
struct farms *p,*q,*r;
p=&farms[x];
r=p;
while(r!=r->father)
r=r->father;
while(p!=r)
{
q=p->father;
p->father=r;
p=q;
}
return r;
}
void Union(int x, int y)
{
if(farms[x].father->rank>farms[y].father->rank)
farms[y].father->father=farms[x].father;
else
{
farms[x].father->father=farms[y].father;
if(farms[x].father->rank==farms[y].father->rank)
farms[y].father->rank++;
}
}
int main(){
int N,E;
int i,j;
int min,count;
int ncases;
scanf("%d",&ncases);
while(ncases--)
{
scanf("%d%d",&N,&E);
min=0;
for(i=0;i<E;i++)
scanf("%d%d%d",&fiber[i].f1,&fiber[i].f2,&fiber[i].length);
quicksort(fiber,0,E-1);
for(i=0;i<N;i++)
Make_Set(i);
for(i=0;i<E;i++)
{
if(Find_Set(fiber[i].f1)!=Find_Set(fiber[i].f2))
{
Union(fiber[i].f1,fiber[i].f2);
min+=fiber[i].length;
}
}
printf("%d\n",min);
}
return 0;
}