mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
9da6cdd5bd
3900-3999
156 lines
4.1 KiB
C++
156 lines
4.1 KiB
C++
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <math.h>
|
|
#include <algorithm>
|
|
using namespace std;
|
|
struct Point
|
|
{
|
|
double x, y;
|
|
} node[201];
|
|
struct T_T
|
|
{
|
|
int id;
|
|
double dis;
|
|
} que[201];
|
|
double sx, sy;
|
|
double ans;
|
|
double dis[201];
|
|
double map[201][201];
|
|
int q[201][201], q2[201][201];
|
|
int n;
|
|
int m;
|
|
bool vis[201];
|
|
int ra, rb, rc, rd;
|
|
double rmin;
|
|
double rdis;
|
|
double dist(int i, int j)
|
|
{
|
|
return sqrt((node[i].x - node[j].x) * (node[i].x - node[j].x)
|
|
+ (node[i].y - node[j].y) * (node[i].y - node[j].y));
|
|
}
|
|
bool cmp(T_ a, T_ b)
|
|
{
|
|
return a.dis < b.dis;
|
|
}
|
|
void init()
|
|
{
|
|
for(int i = 0; i < m; i++) dis[i] = dist(i, m);
|
|
for(int i = 0; i < m; i++)
|
|
for(int j = i + 1; j < m; j++)
|
|
map[i][j] = map[j][i] = dist(i, j);
|
|
for(int i = 0; i < m; i++)
|
|
{
|
|
int temp = 0;
|
|
for(int j = 0; j < m; j++)
|
|
if(i != j)
|
|
{
|
|
que[temp].id = j;
|
|
que[temp].dis = dis[j] + map[j][i];
|
|
temp++;
|
|
}
|
|
sort(que, que + temp, cmp);
|
|
for(int j = 0; j < temp; j++)
|
|
q[i][j] = que[j].id;
|
|
}
|
|
for(int i = 0; i < m; i++)
|
|
{
|
|
int temp = 0;
|
|
for(int j = 0; j < m; j++)
|
|
if(i != j)
|
|
{
|
|
que[temp].id = j;
|
|
que[temp].dis = map[i][j];
|
|
temp++;
|
|
}
|
|
sort(que, que + temp, cmp);
|
|
for(int j = 0; j < temp; j++)
|
|
q2[i][j] = que[j].id;
|
|
}
|
|
}
|
|
void solve()
|
|
{
|
|
rmin = -1;
|
|
int a, b, c, d;
|
|
for(b = 0; b < m; b++)
|
|
if(!vis[b])
|
|
{
|
|
for(c = 0; c < m; c++)
|
|
if(!vis[c] && b != c)
|
|
{
|
|
int t = 0;
|
|
a = q[b][t];
|
|
while(vis[a] || a == c)
|
|
{
|
|
t++;
|
|
a = q[b][t];
|
|
}
|
|
t = 0;
|
|
d = q2[c][t];
|
|
while(vis[d] || d == a || d == b)
|
|
{
|
|
t++;
|
|
d = q2[c][t];
|
|
}
|
|
double cou = dis[a] + map[a][b] + map[b][c] + map[c][d];
|
|
double cdis = (dis[a] + dis[b] + dis[c] + dis[d]) / 4.0;
|
|
if(rmin < 0 || cou < rmin || (rmin == cou && cdis < rdis))
|
|
{
|
|
rmin = cou;
|
|
rdis = cdis;
|
|
ra = a, rb = b, rc = c, rd = d;
|
|
}
|
|
t = 0;
|
|
d = q2[c][t];
|
|
while(vis[d] || d == b)
|
|
{
|
|
t++;
|
|
d = q2[c][t];
|
|
}
|
|
t = 0;
|
|
a = q[b][t];
|
|
while(vis[a] || a == c || a == d)
|
|
{
|
|
t++;
|
|
a = q[b][t];
|
|
}
|
|
cou = dis[a] + map[a][b] + map[b][c] + map[c][d];
|
|
cdis = (dis[a] + dis[b] + dis[c] + dis[d]) / 4.0;
|
|
if(rmin < 0 || cou < rmin || (rmin == cou && cdis < rdis))
|
|
{
|
|
rmin = cou;
|
|
rdis = cdis;
|
|
ra = a, rb = b, rc = c, rd = d;
|
|
}
|
|
}
|
|
}
|
|
vis[ra] = 1;
|
|
vis[rb] = 1;
|
|
vis[rc] = 1;
|
|
vis[rd] = 1;
|
|
ans += rmin;
|
|
}
|
|
int main()
|
|
{
|
|
int T;
|
|
int cas = 1;
|
|
scanf("%d", &T);
|
|
while(T--)
|
|
{
|
|
scanf("%lf%lf", &sx, &sy);
|
|
scanf("%d", &n);
|
|
m = 4 * n;
|
|
for(int i = 0; i < m; i++) scanf("%lf%lf", &node[i].x, &node[i].y);
|
|
node[m].x = sx;
|
|
node[m].y = sy;
|
|
init();
|
|
ans = 0;
|
|
memset(vis, 0, sizeof(vis));
|
|
for(int i = 0; i < n; i++)
|
|
{
|
|
solve();
|
|
}
|
|
printf("Case #%d: %0.2lf\n", cas++, ans);
|
|
}
|
|
return 0;
|
|
}
|