| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
半小时看题+思路+AC,最有成就感的一题//二分+生成树
#include<iostream>
#include<cstdio>
#include<string>
#include<string.h>
#include<map>
#include<vector>
#include<algorithm>
#include<queue>
#include<math.h>
using namespace std;
#pragma warning(disable:4996)
#define ll long long
#define vec vector<int>
//#define P pair<int,int>
#define inf 0x3f3f3f3f
#define MAX 505
struct edge {
int from, to; double d;
edge(int i, int j, double dis) { from = i, to = j, d = dis; }
};
bool cmp(edge e1, edge e2) { return e1.d < e2.d; }
vector<edge> v;
int x[MAX], y[MAX], T, S, P, kind[MAX];
double dis[MAX][MAX];
//计算距离
double d(int i, int j) {
return sqrt(1.0*(x[i] - x[j])*(x[i] - x[j]) + (y[i] - y[j])*(y[i] - y[j]));
}
//生成树并查集相关
int find(int k) {
if (k == kind[k])return k;
else return kind[k] = find(kind[k]);
}
void unite(int a, int b) { kind[find(b)] = kind[find(a)]; }
//检查最小距离为mid时能否满足要求
bool check(double mid) {
int cnt = 0, num = 0;
for (int i = 1; i <= P; i++)kind[i] = i;
//距离比最短距离小,P个点最多P-1条边
for (int i = 0; i < v.size() && v[i].d <= mid && cnt < P - 1; i++) {
edge e = v[i];
if (find(e.to) != find(e.from)) {
unite(e.to, e.from);
}
}
for (int i = 1; i <= P; i++) {
if (find(i) == i)num++;//一个单独的联通子图
}
if (num <= S)return true;//子图的个数不多于satellite 的数目-1
else return false;
}
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d %d", &S, &P);
for (int i = 1; i <= P; i++)scanf("%d %d", &x[i], &y[i]);
v.clear();
double l = 0, r = -inf;
for (int i = 1; i <= P; i++)
for (int j = i + 1; j <= P; j++) {
dis[i][j] = dis[j][i] = d(i, j);
if (dis[i][j] >= r)r = dis[i][j] + 1;
v.push_back(edge(i, j, dis[i][j]));
}
sort(v.begin(), v.end(), cmp);
//二分求最小
while (r - l >= 0.001) {
double mid = (r + l) / 2;
if (check(mid))r = mid;
else l = mid;
}
printf("%.2lf\n", r);
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator