hdu 3585 最快代码

来源:互联网 发布:摄像头录制软件 编辑:程序博客网 时间:2024/04/27 15:58

hdu上第三,15ms

用的是前面一篇文章中讲过的算法  http://blog.csdn.net/techmonster/article/details/50658951

基本思想和网上的都一样,主要极大团的算法不同,另外加上了输入优化. 下面代码没有作输入优化,但交上去时间相差不多(可能没相差)

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<cctype>#define N 55using 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;}


1 0
原创粉丝点击