hdu上第三,15ms
用的是前面一篇文章中讲过的算法 http://blog.csdn.net/techmonster/article/details/50658951
基本思想和网上的都一样,主要极大团的算法不同,另外加上了输入优化. 下面代码没有作输入优化,但交上去时间相差不多(可能没相差)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cctype>
#define N 55
using namespace std;
int n, k, cnt, l, r, mid, le;
double ans;
int x[N], y[N], d[N][N], dist[2500], a[N],some[55][55];
bool dfs(int deep, int sn,int an)
{
if(an >= k) return 1;
if(sn + an < k) return 0;
int u = some[deep][0];//pivot vertex
for(int i = 0; i < sn; i ++)
{
int v = some[deep][i];
if(d[u][v] >= le) continue;
int tsn = 0;
for(int j = 0; j < sn; j ++)if(d[v][some[deep][j]] >= le) some[deep + 1][tsn ++] = some[deep][j];
if(dfs(deep + 1, tsn, an + 1)) return 1;
//把v从some取出,放入none
some[deep][i] = 0;
}
return 0;
}
int getdist(int u, int v)
{
return (x[u] - x[v]) * (x[u] - x[v]) + (y[u] - y[v]) * (y[u] - y[v]);
}
int main()
{
//freopen("t.txt","r",stdin);
while(~scanf("%d%d", &n, &k))
{
for (int i = 1; i <= n; i++) {scanf("%d%d",&x[i],&y[i]);}
cnt = 0;
for (int i = 1; i < n; i++)
for (int j = i+1; j <= n; j++)
{
d[i][j] = getdist(i, j);
d[j][i] = d[i][j];
cnt++;
dist[cnt] = d[i][j];
}
sort(dist+1, dist+cnt+1);
l = 1;
r = cnt;
while (l <= r)
{
for(int i = 0; i < n; ++i) some[0][i] = i+1;//初始状态为所有点
mid = (l + r) / 2;
le = dist[mid];
a[0] = 0;
if (dfs(0,n,0))
{
l = mid + 1;
ans = sqrt(dist[mid]);
}
else
{
r = mid - 1;
}
}
printf("%.2f\n", ans);
}
return 0;
}