Problem B
来源:互联网 发布:淘宝卖家如何添加客服 编辑:程序博客网 时间:2024/05/16 06:27
简单题意
在平面直角坐标系中给出各个点的坐标,要求把这些点连通起来,要求连接的线段长最短
解题思路形成过程
经历了第一题的转化的教训,我想了想这个题还能用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;
}
- Problem B
- Problem B
- Problem B
- Problem B
- Problem B
- Problem B
- Problem B
- Problem B
- Problem B
- Problem B
- Problem b
- Problem B
- Problem B
- Problem-B
- Problem B
- Problem B
- Problem-B
- Problem B
- Swift使用FMDB操作SQLite
- SIFT算法研究
- Ubuntu下numpy安装缺少Python.h头文件无法通过编译与python2.7-dev无法安装
- XML、HTML、CSS与JS的区别整理
- MySQL 拼接成一个字符串
- Problem B
- Pixhawk之姿态控制篇(2)_控制策略
- spring事务配置的5种方式
- Php高级知识 2
- VMware虚拟机的安装
- iOS程序崩溃日志
- MyEclipse安装JS代码提示(Spket插件)
- 【代码笔记】iOS-实现网络图片的异步加载和缓存
- IOS Sqlite使用FMDB