zoj1203

来源:互联网 发布:淘宝网茵曼旗舰店 编辑:程序博客网 时间:2024/05/05 14:49

题目大意:

给n个城市的坐标,计算连接这N个城市所需线路长度总和的最小值。

解题思路:

最小生成树,prim算法的应用

代码如下:

#include<iostream>#include<stdio.h>#include<math.h>using namespace std;typedef struct{  bool b;  double x,y;}no;int n;no node[110];double map[110][110];double prim(){  int i,j,nd1,nd2,num;  double lenn=0,max;  node[0].b=true;  num=1;  while(num<n)  {    max=10000000;    for(i=0;i<n;i++)    {      if(node[i].b)      {        for(j=0;j<n;j++)        {          if(node[j].b)  continue;          else if(map[i][j]<max)          {            max=map[i][j];nd1=i;nd2=j;          }        }      }    }    num++;    node[nd2].b=true;    lenn+=map[nd1][nd2];  }  return lenn;}int main(){  int count=0;  scanf("%d",&n);  while(n)  {    count++;    int i,j;    for(i=0;i<n;i++)    {      scanf("%lf%lf",&node[i].x,&node[i].y);      node[i].b=false;    }    for(i=0;i<n-1;i++)    {      for(j=i+1;j<n;j++)      {        double temp;        temp=(node[i].x-node[j].x)*(node[i].x-node[j].x)+(node[i].y-node[j].y)*(node[i].y-node[j].y);        temp=sqrt(temp);        map[i][j]=map[j][i]=temp;      }    }    printf("Case #%d:\n",count);    printf("The minimal distance is: %.2lf\n",prim());    scanf("%d",&n);    if(n)      printf("\n");  }  return 0;}
0 0
原创粉丝点击