Program4_D
来源:互联网 发布:java 微信发送消息 编辑:程序博客网 时间:2024/04/25 14:03
我现在做的是第四专题编号为1004的试题,具体内容如下所示:
Problem D
Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 11 Accepted Submission(s) : 5
31 2 11 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50
35
简单题意:
使两个村之间都能通路,计算最小的公路长度。
解题思路:
这是一个非常明显的最小生成树的问题。所谓最小生成树,即用每个价值(距离)最小的边把所有的点连接起来。基本步骤:1、对边的距离进行排序2、按照长度从小到大的顺序对边进行操作,判断该边所连接的两点是否已经被连了,未连接就把当前的长度加上该边所有的长度
编写代码:
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int a,b;
int len;
}p[5000];
int cmp(node x,node y)
{
if(x.len!=y.len)
return x.len<y.len;
}
int main()
{
int i,sum,n,m,num;
int f[200];
while(scanf("%d",&n),n!=0)
{
m=(n*(n-1))/2;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].len);
}
sort(p,p+m,cmp);
for(i=1;i<=n;i++)
f[i]=1;
f[p[0].a]=0;
sum=0;
for(i=0;i<m;i++)
{
num=f[p[i].a]+f[p[i].b];
if(num==1)
{
sum+=p[i].len;
f[p[i].a]=f[p[i].b]=0;
i=0;
}
}
printf("%d\n",sum);
}
return 0;
}