-
description |
某省长调查交通情况,发现本省交通事故发生不断,于是决定在本省内全部修建地铁。
该省长得到的统计表中列出了任意两市之间的距离,为了确保任何两个市都可以直接
或者间接实现地铁交通,并要求铺设的地铁总长度最小,请计算最小的地铁总长度。
|
input |
测试输入包含若干测试用例。每个测试用例的第一行给出市的数目n,(n < 50);随后的
n(n-1)/2行对应市之间的距离,每行给出一对正整数,分别是两个市的编号,以及两
市之间的距离。为简单起见,市从1到n编号,当n为0时,输入结束,该样例不做处理。
|
output |
对每个测试用例,在一行里输出最小的地铁总长度,保留两位小数。
|
sample_input |
3
1 2 1.8
1 3 2.9
2 3 4.5
0
|
sample_output |
4.70
用前向星写着玩玩,当然直接临接表会快些
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<iomanip>
#include<cctype>
#define MAX 456789123
using namespace std;
struct node
{
int next,to;
double val;
}bb[1000];
int sum=0,head[1000];
double ans=0,sss[1000];int N;
int visit[1000];
void add(int a,int b,double c)
{
bb[sum].to=b;
bb[sum].next=head[a];
bb[sum].val=c;
head[a]=sum++;
}
void zx(int a)
{
double max=MAX;int k=MAX;
for(int i=head[a];i!=-1;i=bb[i].next)
{
int u=bb[i].to;
if(!visit[u])
{
if(bb[i].val<=sss[u]){sss[u]=bb[i].val;}
}
}
for(int i=1;i<=N;i++)
{
if(!visit[i]&&sss[i]<max)
{
max=sss[i];k=i;
}
cout<<i<<' '<<sss[i]<<endl;
}
visit[k]=1;
ans=ans+max;
}
int main()
{
while(cin>>N&&N)
{
for(int i=1;i<=N;i++)
sss[i]=MAX;
memset(visit,0,sizeof(visit));
memset(head,-1,sizeof(head));
int n;
n=N*(N-1)/2;
while(n--)
{
int a,b;
double c;
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
}
for(int i=1;i<N;i++)
{
visit[i]=1;
zx(i);
}
printf("%.2f\n",ans);
}
}
|
转载于:https://www.cnblogs.com/SparkPhoneix/p/8858483.html