poj 2420 A Star not a Tree? 模拟退火
2015-09-16 20:52
411 查看
题目
题目链接:http://poj.org/problem?id=2420题目来源:Natureal的blog
简要题意:找一个点,令它到NN个节点的距离之和最小。
数据范围:N⩽100;|x|,|y|⩽10000N \leqslant 100;\quad |x|,|y|\leqslant 10000
题解
使用模拟退火来解决即可。比较裸。
实现
需要注意的是八个方向来退火会比较好。同时poj上不能使用随机数的
srand();会RE
代码
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <stack> #include <queue> #include <string> #include <vector> #include <set> #include <map> typedef long long LL; #define mp make_pair #define all(x) (x).begin(),(x).end() #define sz(x) ((int)(x).size()) #define fi first #define se second using namespace std; // head typedef pair<double, double> PDD; const int N = 105; const double minT = 0.1; const double R = 0.9; int dx[] = { 0, 0, 1, -1, 1, -1, 1, -1 }; int dy[] = { 1, -1, 0, 0, -1, 1, 1, -1 }; PDD a ; double eucDis(PDD &a, PDD &b) { double x = (a.fi-b.fi), y = (a.se-b.se); return sqrt(x*x + y*y); } double getSum(int n, PDD &x) { double sum = 0.0; for (int i = 0; i < n; i++) { sum += eucDis(x, a[i]); } return sum; } PDD mov(PDD &cur, double mul, int dir) { return mp(cur.fi + dx[dir]*mul, cur.se + dy[dir]*mul); } double solve(int n, double T) { PDD cur = mp(0, 0); double ans = getSum(n, cur); while (T > minT) { for (int dir = 0; dir < 8; dir++) { PDD nxt = mov(cur, T, dir); double temp = getSum(n, nxt); if (temp < ans) { ans = temp; cur = nxt; } } T *= R; } return ans; } int main() { int n; while (scanf("%d", &n) == 1) { double len = 0.0; for (int i = 0; i < n; i++) { scanf("%lf%lf", &a[i].fi, &a[i].se); len = max(len, max(fabs(a[i].fi), fabs(a[i].se))); } printf("%.0f\n", solve(n, len)); } return 0; }
相关文章推荐
- php实现验证码
- JAVA异常处理
- 关于导航栏和状态栏的一些UI设置
- gridview向右点击,到下一行,循环滚动
- FreeMarker全面教程
- 简单的快速幂
- NEERC 2014 Problem B. Burrito King
- net-snmp5.7.3移植到arm-linux平台
- Linux基础篇-压缩、解压缩命令
- Android中自制各种进度条的实现
- Axis与Spring的集成
- Could not resolve com.android.support:appcompat-v7:22.2.1
- intent
- 变量名的力量(一)
- LNMP的并发考虑与资源分配
- servlet中的各种编码
- C# 生成CODE128条码
- ios-新浪微博开发07-自定义搜索框
- 统计文件中的单词个数
- javascript 回调函数用法演示