其他的不说了
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000
struct road{
struct road *father;
int rank;
}Villages[50];
int main(){
void init(int Adj[][50], int points);
void Sort(int road[][1275], int n);
void Make_Set(struct road *p);
void Union(struct road *p1, struct road *p2);
struct road *Find_Set(struct road *p);
int road[3][1275];
int Adj[50][50];
int i,j,boot=0,a,b,length,points,routes,sum;
struct road *p1,*p2,*p;
p=Villages;
while(scanf("%d",&points)&&points!=0)
{
sum=0;
boot=0;
scanf("%d",&routes);
init(Adj,points);
for(i=0;i<routes;i++)
{
scanf("%d %d %d",&a,&b,&length);
if(length<Adj[a-1][b-1])
{
Adj[a-1][b-1]=length;
Adj[b-1][a-1]=length;
}
}
for(i=0;i<points;i++)
{
for(j=i+1;j<points;j++)
{
if(Adj[i][j]<MAX)
{
road[0][boot]=i;
road[1][boot]=j;
road[2][boot]=Adj[i][j];
boot++;
}
}
}
for(i=0;i<points;i++)
Make_Set(p+i);
Sort(road,boot);
for(i=0;i<boot;i++)
{
if((p1=Find_Set(p+road[0][i]))!=(p2=Find_Set(p+road[1][i])))
{
Union(p1,p2);
sum+=road[2][i];
}
}
printf("%d\n",sum);
}
return 0;
}
void init(int Adj[][50], int points)
{
int i,j;
for(i=0;i<points;i++)
{
for(j=0;j<points;j++)
Adj[i][j]=MAX;
}
}
void Sort(int road[][1275], int n)
{
int i,j;
int temp,min,boot;
for(i=0;i<n-1;i++)
{
min=road[2][i];
boot=i;
for(j=i+1;j<n;j++)
{
if(min>road[2][j])
{
min=road[2][j];
boot=j;
}
}
if(boot!=i)
{
road[2][boot]=road[2][i];
road[2][i]=min;
min=road[1][boot];
road[1][boot]=road[1][i];
road[1][i]=min;
min=road[0][boot];
road[0][boot]=road[0][i];
road[0][i]=min;
}
}
}
void Make_Set(struct road *p)
{
p->father=p;
p->rank=1;
}
void Union(struct road *p1, struct road *p2)
{
if(p1->rank>p2->rank)
{
p2->father=p1;
}
else
{
p1->father=p2;
if(p1->rank==p2->rank)
p2->rank++;
}
}
struct road *Find_Set(struct road *p)
{
struct road *r,*q;
r=p;
while(r!=r->father)
r=r->father;
while(p!=r)
{
q=p;
p=p->father;
q->father=r;
}
return r;
}