博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2560 Freckles
阅读量:5329 次
发布时间:2019-06-14

本文共 3460 字,大约阅读时间需要 11 分钟。

题目连接

  

Freckles

Description

In an episode of the Dick Van Dyke show, little Richie connects the freckles on his Dad's back to form a picture of the Liberty Bell. Alas, one of the freckles turns out to be a scar, so his Ripley's engagement falls through. 

Consider Dick's back to be a plane with freckles at various (x,y) locations. Your job is to tell Richie how to connect the dots so as to minimize the amount of ink used. Richie connects the dots by drawing straight lines between pairs, possibly lifting the pen between lines. When Richie is done there must be a sequence of connected lines from any freckle to any other freckle.

Input

The first line contains 0 < n <= 100, the number of freckles on Dick's back. For each freckle, a line follows; each following line contains two real numbers indicating the (x,y) coordinates of the freckle.

Output

Your program prints a single real number to two decimal places: the minimum total length of ink lines that can connect all the freckles.

Sample Input

3

1.0 1.0
2.0 2.0
2.0 4.0

Sample Output

3.41

$n$个点用$Prim$求最小生成树,开始用的$double$类型$\%lf$控制精度$g++$不停地wa后改为$float,\%f$过了/(ㄒoㄒ)/~~

#include
#include
#include
#include
#include
#include
#include
#include
#include
using std::set;using std::pair;using std::swap;using std::multiset;using std::priority_queue;#define pb(e) push_back(e)#define sz(c) (int)(c).size()#define mp(a, b) make_pair(a, b)#define all(c) (c).begin(), (c).end()#define iter(c) __typeof((c).begin())#define cls(arr, val) memset(arr, val, sizeof(arr))#define cpresent(c, e) (find(all(c), (e)) != (c).end())#define rep(i, n) for(int i = 0; i < (int)n; i++)#define tr(c, i) for(iter(c) i = (c).begin(); i != (c).end(); ++i)const int N = 110;const int INF = 0x3f3f3f3f;typedef unsigned long long ull;struct P { float x, y; P(float i = 0.0, float j = 0.0) :x(i), y(j) {} inline float calc(const P &k) const { return sqrt((x - k.x) * (x - k.x) + (y - k.y) * (y - k.y)); }}A[N];struct PDI { int v; float s; PDI(int i = 0, float j = 0.0) :v(i), s(j) {} inline bool operator<(const PDI &k) const { return s > k.s; }};struct Prim { bool vis[N]; int tot, head[N]; float mincost[N]; struct edge { int to; float w; int next; }G[(N * N) << 1]; inline void init(int n) { tot = 0; rep(i, n + 1) { head[i] = -1; vis[i] = false; mincost[i] = INF; } } inline void add_edge(int u, int v, float w) { G[tot] = (edge){ v, w, head[u] }; head[u] = tot++; } inline void built(int n) { rep(i, n) scanf("%f %f", &A[i].x, &A[i].y); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) continue; add_edge(i + 1, j + 1, A[i].calc(A[j])); } } } inline void prim(int s = 1) { float ans = 0.0; priority_queue
q; q.push(PDI(s)); for (int i = head[s]; ~i; i = G[i].next) { edge &e = G[i]; q.push(PDI(e.to, mincost[e.to] = e.w)); } vis[s] = true; while (!q.empty()) { PDI t = q.top(); q.pop(); int u = t.v; if (vis[u]) continue; vis[u] = true; ans += mincost[u]; for (int i = head[u]; ~i; i = G[i].next) { edge &e = G[i]; if (mincost[e.to] > e.w && !vis[e.to]) { q.push(PDI(e.to, mincost[e.to] = e.w)); } } } printf("%.2f\n", ans); } inline void solve(int n) { init(n), built(n), prim(); }}go;int main() {#ifdef LOCAL freopen("in.txt", "r", stdin); freopen("out.txt", "w+", stdout);#endif int n; while (~scanf("%d", &n)) { go.solve(n); } return 0;}

转载于:https://www.cnblogs.com/GadyPu/p/4780795.html

你可能感兴趣的文章
Zookeeper 概念
查看>>
系统开机启动项优化
查看>>
docker 报错:x509: certificate has expired or is not yet valid
查看>>
追求--Mars&Coara
查看>>
svn sync主从同步学习
查看>>
Hdu-1358Period(KMP算法之next数组的应用)
查看>>
Thrift 个人实战--Thrift RPC服务框架日志的优化
查看>>
u盘启动盘安装centos7.5操作系统
查看>>
对于PHP面试知识点的小结
查看>>
A guess 解题报告
查看>>
a:link,a:visited,a:hover,a:active
查看>>
ubuntu12.04 安装配置jdk1.7
查看>>
android深度探索第二章
查看>>
asp.net学习笔记1
查看>>
linux下编译复数类型引发的错误:expected unqualified-id before '(' token
查看>>
sed用法
查看>>
codeforces 1041A Heist
查看>>
centos 7 升级python2.7 到3.5
查看>>
字典常用方法
查看>>
打开图片
查看>>