题目大意:某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
解题思路:求最小公路总长度,先将已给的道路根据距离进行从小到大排序,再从最小的公路总长度开始,判断该路连接的两条是否已经连接上,即判断这两条路是否独立,如果是,连接这条路,将这条路的距离加入总长度中,如果不是,继续寻找下一条长度最短的路,直到连接的路的数目等于村庄的数目减1.
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int a[100];
struct way{
int x;
int y;
int s;
};
bool cmp(way a,way b)
{
return a.s <b.s ;
}
int find(int x)
{
int y=x;
while(a[y]!=y)
y=a[y];
return y;
}
void fun(int x,int y)
{
int fx,fy;
fx=find(x);
fy=find(y);
if(fx!=fy)
a[fx]=fy;
}
int main()
{
int n;
while(cin>>n&&n)
{
int m=n*(n-1)/2;
int sum=0,cun=0;
struct way w[5000]={0};
for(int i=1;i<=n;i++)
a[i]=i;
for(int i=0;i<m;i++)
{
cin>>w[i].x >>w[i].y>>w[i].s ;
}
sort(w,w+m,cmp);
for(int i=0;i<m;i++)
{
if(find(w[i].x )!=find(w[i].y ))
{
fun(w[i].x ,w[i].y );
sum+=w[i].s ;
cun++;
}
if(cun==n-1)
break;
}
cout<<sum<<endl;
}
return 0;
}
遇到的问题:1.将村庄的序号误从0开始
2.将数组和结构体数组的长度开大了,导致runtime error。