简单题意
在平面直角坐标系中给出各个点的坐标,要求把这些点连通起来,要求连接的线段长最短
解题思路形成过程
经历了第一题的转化的教训,我想了想这个题还能用Problem D的代码把dis数组的内容改一下即可,dis数组保存的是任意两个地点之间的距离,这个题只给了各个点的坐标,那任意两个点的距离就自己算嘛(其实是想偷懒利用原来的代码,冒着自己算可能会超时的风险),算完之后,还有一些细节要修改,就是数据类型,应为是double很多数据类型要改而且memset这个函数就不能用来给Min数组用16进制赋初值了。
感想
其实就是抱着试试看的心情,重用了代码,没想到又过了。一个代码用好多遍,感觉好兴奋。
AC代码
#include <iostream>
#include <cmath>
#include <fstream>
#include <string.h>
using namespace std;
struct node{
double x,y;
};
node p[105];
int n;
double Min[110];
bool visit[110];
double dis[110][110];
void solve(){
memset(visit,0,sizeof(visit));
int x=1;
visit[1]=1;
double sum=0;
for(int i=2;i<=n;i++)
Min[i]=dis[1][i];
for(int i=1;i<n;i++){
double temp=10000000.0;
for(int j=1;j<=n;j++)
if(!visit[j]&&temp>Min[j]){
temp=Min[j];
x=j;
}
sum+=temp;
visit[x]=1;
for(int j=1;j<=n;j++)
if(!visit[j]&&dis[j][x]<Min[j])
Min[j]=dis[j][x];
}
printf("%.2lf\n",sum);
}
int main()
{
ifstream cin("in.txt");
while(cin>>n&&n){
memset(dis,0,sizeof(dis));
for(int i=1;i<=n;i++){
cin>>p[i].x>>p[i].y;
}
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
dis[i][j]=dis[j][i]=sqrt((p[j].x-p[i].x)*(p[j].x-p[i].x)+(p[j].y-p[i].y)*(p[j].y-p[i].y));
}
}
solve();
}
return 0;
}