SSL-ZYC 1618 剑鱼行动
2018-01-05 20:45
176 查看
题目大意:
给出N个点的坐标,对它们建立一个最小生成树,代价就是连接它们的路径的长度,现要求总长度最小。N的值在100以内,坐标值在[-10000,10000].结果保留二位小数。
思路:
这道题比其他的树要麻烦一些,它不是给出每两个点之间的距离,而是给出每个点的坐标,它们之间的距离需要我们运用勾股定理自己去求!
勾股定理:
若该三角形为直角三角形,且a和b为两条直角边,则:
a^2+b^2=c^2
运用勾股定理就可以求出两个点之间的距离。
求出距离后就能用最基础的方法去做啦!
代码:
给出N个点的坐标,对它们建立一个最小生成树,代价就是连接它们的路径的长度,现要求总长度最小。N的值在100以内,坐标值在[-10000,10000].结果保留二位小数。
思路:
这道题比其他的树要麻烦一些,它不是给出每两个点之间的距离,而是给出每个点的坐标,它们之间的距离需要我们运用勾股定理自己去求!
勾股定理:
若该三角形为直角三角形,且a和b为两条直角边,则:
a^2+b^2=c^2
运用勾股定理就可以求出两个点之间的距离。
求出距离后就能用最基础的方法去做啦!
代码:
#include <cstdio> #include <iostream> #include <cmath> using namespace std; double a[101][101],x[101],y[101],c[101],minn,sum; int n,b[20001],k; int main() { scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%lf%lf",&x[i],&y[i]); for (int j=1;j<=i-1;j++) a[i][j]=a[j][i]=sqrt(abs(x[i]-x[j])*abs(x[i]-x[j])+abs(y[i]-y[j])*abs(y[i]-y[j])); //求两点之间的距离 } b[1]=1; //进入集合 for (int i=2;i<=n;i++) { if (a[1][i]!=0) c[i]=a[1][i]; //集合外的点到集合的最短距离 } for (int q=1;q<=n-1;q++) { minn=2147483647; for (int i=1;i<=n;i++) { if (c[i]!=0&&c[i]<minn&&b[i]==0) //如果有一个集合外的点距离集合内的点更近 { minn=c[i]; k=i; } } b[k]=1; //进入集合 sum+=c[k]; c[k]=0; for (int i=1;i<=n;i++) { if ((c[i]==0&&a[k][i]!=0&&b[i]==0)||a[k][i]<c[i]) //重新计算集合外的点到集合的最短距离 c[i]=a[k][i]; } } printf("%0.2lf\n",sum); return 0; }
相关文章推荐
- ssl 1618 剑鱼行动
- (ssl1618)剑鱼行动
- SSL 1618——剑鱼行动(最小生成树)
- SSL-ZYC 手机
- SSL-ZYC 懒惰的奶牛①
- SSL-ZYC 方案数
- SSL-ZYC 前缀转后缀
- SSL-ZYC 逆序统计
- SSL-ZYC 1764 最小生成树Ⅱ
- SSL-ZYC 1614 医院设置
- SSL-ZYC 游戏
- SSL-ZYC 数池塘
- SSL-ZYC 家族
- SSL-ZYC 2347 搭配购买
- SSL-ZYC 1624 小萨的烦恼
- SSL-ZYC 1127 方程的解数
- SSL-ZYC 2547 圆环
- SSL-ZYC 1455 电子老鼠闯迷宫
- SSL-ZYC 奇数统计
- SSL-ZYC 1125 集合