本文共 1415 字,大约阅读时间需要 4 分钟。
某省长调查交通情况,发现本省交通事故发生不断,于是决定在本省内全部修建地铁。该省长得到的统计表中列出了任意两市之间的距离,为了确保任何两个市都可以直接或者间接实现地铁交通,并要求铺设的地铁总长度最小,请计算最小的地铁总长度。
测试输入包含若干测试用例。每个测试用例的第一行给出市的数目n,(n < 50);随后的n(n-1)/2行对应市之间的距离,每行给出一对正整数,分别是两个市的编号,以及两市之间的距离。为简单起见,市从1到n编号,当n为0时,输入结束,该样例不做处理。
对每个测试用例,在一行里输出最小的地铁总长度,保留两位小数。
31 2 1.81 3 2.92 3 4.50
4.70 用前向星写着玩玩,当然直接临接表会快些
#include #include #include #include #include #include #include #include #include #include #include #include #define MAX 456789123using 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] >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
转载于:https://www.cnblogs.com/SparkPhoneix/p/8858483.html