本题求的是最小生成树,Kustra(或prim)算法。快排时用qsort,不用冒泡(可能会超时);
题意:使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
Kustra算法求解:
#include"stdio.h"
#include"stdlib.h"
int set[105],n,m,sum;
struct e
{
int x,y,v;
}val[10000];
int cmp(const void *a,const void *b)
{
return ((e *)a)->v-((e *)b)->v;
}
int find(int x)
{
return x==set[x]?set[x]:find(set[x]);
}
void Kustra()
{
for(int i=0;i<m;++i)
{
int a=val[i].x,b=val[i].y,v=val[i].v;
if(find(a)!=find(b))
{
sum+=v;
set[find(a)]=find(b);
}
}
}
int main()
{
while(scanf("%d",&n),n)
{
sum=0;
m=n*(n-1)/2;
for(int i=0;i<=n;++i)
set[i]=i;
for(int i=0;i<m;++i)
scanf("%d%d%d",&val[i].x,&val[i].y,&val[i].v);
qsort(val,m,sizeof(val[0]),cmp);
Kustra();
printf("%d\n",sum);
}
return 0;
}
prim算法求解:
#include"stdio.h"
#define dingtype int
#define MAXX 999999
#define leng 101
dingtype map[leng][leng];
dingtype dis[leng];
int prim(int n)
{
int min;
int i,j;
int c=1;
int sum=0;
dis[c]=0;
for(i=1;i<=n;i++)
{
if(map[i][c]!=0)
{
dis[i]=map[i][c];
}
}
for(i=2;i<=n;i++)
{
min=MAXX;
for(j=1;j<=n;j++)
{
if(dis[j]<min&&dis[j]!=0)
{
min=dis[j];
c=j;
}
}
dis[c]=0;
sum+=min;
for(int j=1;j<=n;j++)
{
if(map[j][c]!=0&&(map[j][c]<dis[j])&&dis[j]!=0)
{
dis[j]=map[j][c];
}
}
}
return sum;
}
int main()
{
int n;
int i,d,x,y,sum;
while(scanf("%d",&n),n)
{
for(i=1;i<=n*(n-1)/2;i++)
{
scanf("%d%d%d",&x,&y,&d);
map[x][y]=map[y][x]=d;
}
for(i=1;i<=n;i++)
{
map[i][i]=0;
}
sum=prim(n);
printf("%d\n",sum);
}
return 0;
}