C语言的一个题

来源:百度知道 编辑:UC知道 时间:2024/06/21 06:19:03
OI国由n个城市组成,所有城市位于一平面坐标系中,每个城市的坐标是已知的,且坐标都是整数。现在,OI国的CHEN主席想加快网络信息传递,决定选若干对城市,每对城市之间用一条高速网线相连,并且使所有的城市都可以直接或间接相连。已知两城市之间的距离为它们的直线距离,求所需网线的最小长度。
【输入:】
n
n行,每行有两个整数x , y 表示第i个城市的坐标为 (x , y )
【输出:】
最短的网线的长度。 结果保留3为小数。
【输入样例:】
6
2 1
4 1
5 4
3 5
3 3
2 3
【输出样例:】
9.236

直接写一个最小生成树就可以,把这个生成图来做。然后直接套用算法就可以。

/*VC6.0下通过*/
#include "stdio.h"
#include "math.h"
#include "conio.h"
typedef struct
{
float edge[100][100];
int n;
}MGraph;
void Prim(MGraph g,int v);
float distancce=0;
void main()
{
int n,i,j;
MGraph g;
printf("input:\n");
scanf("%d",&n);
g.n=n;
int p[200][2];
for(i=0;i<n;i++)
scanf("%d%d",&p[i][1],&p[i][2]);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{g.edge[i][j]=sqrt((p[i][1]-p[j][1])*(p[i][1]-p[j][1])+
(p[i][2]-p[j][2])*(p[i][2]-p[j][2]));
}
Prim(g,3);
printf("output:\n");
int temp=distancce*1000;
printf("%.3f\n",((float)temp)/1000);
getch();

}
void Prim(MGraph g,int v)
{
float lowcost[100];
float min;
int closest[100],i,j,k;