• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            心如止水
            Je n'ai pas le temps
            posts - 400,comments - 130,trackbacks - 0
            在《程序設計中常用的解題策略》中看到這道題,書上給出了這道題的MST解法,我自己想到的一個做法是“二分+圖遍歷”。
            首先根據點的坐標構造圖G;
            考慮到d的最優值一定是G中的一條邊的權值;
            隨著d的減小,G中邊數減小,因此連通分量可能增加;
            考慮到二分策略:O(logm);
            遍歷圖,計算連通分量的個數N,如果N<=k,此時的d為一個可行解:O(m);
            考慮到浮點誤差,在構造邊的時候不開根號,而用向量表示。
            以下是我的代碼(沒有測試數據……):
            #include<stdio.h>
            #include
            <stdlib.h>
            #include
            <string.h>
            #include
            <math.h>
            const long maxn=507,INF=20007;
            typedef 
            struct
            {
                
            long u,v,x,y;
            }point;
            long n,k,tot,ans;
            point v[maxn],g[maxn][maxn],edge[maxn
            *maxn];
            bool used[maxn];
            int cmp(point a,long dis)
            {
                
            return (a.x*a.x+a.y*a.y-dis);
            }
            void Qsort(long begin,long end)
            {
                
            long i=begin,j=end,t=(begin+end)/2;
                
            long mid=edge[t].x*edge[t].x+edge[t].y*edge[t].y;
                
            do{
                    
            while(cmp(edge[i],mid)<0) i++;
                    
            while(cmp(edge[j],mid)>0) j--;
                    
            if(i<=j)
                    {
                        point t
            =edge[i];edge[i]=edge[j];edge[j]=t;
                        i
            ++;j--;
                    }
                }
            while(i<=j);
                
            if(begin<j) Qsort(begin,j);
                
            if(i<end)   Qsort(i,end);
            }
            void dfs(long now,long limit)
            {
                used[now]
            =true;
                
            for(long i=1;i<=n;i++)
                    
            if(!used[i]&&cmp(g[now][i],limit)<=0)
                    {
                        used[i]
            =true;
                        dfs(i,limit);
                    }
            }
            long travel(point p)
            {
                
            long dis=p.x*p.x+p.y*p.y,re;
                re
            =0;
                memset(used,
            false,sizeof(used));
                
            for(long i=1;i<=n;i++)
                    
            if(!used[i])
                    {
                        dfs(i,dis);
                        re
            ++;
                    }
                
            return re;
            }
            long bsearch(long begin,long end)
            {
                
            long re=end;
                
            while(begin<end)
                {
                    
            long mid=(begin+end)/2;
                    
            if(travel(edge[mid])<=k)
                    {
                        re
            =mid;
                        end
            =mid;
                    }
                    
            else begin=mid+1;
                }
                
            return re;
            }
            int main()
            {
                
            //*
                freopen("data.in","r",stdin);
                freopen(
            "data.out","w",stdout);
                
            //*/
                scanf("%ld%ld",&n,&k);
                
            for(long i=1;i<=n;i++)
                    scanf(
            "%ld%ld",&v[i].x,&v[i].y);
                
            //  Input
                for(long i=1;i<=n;i++)
                    
            for(long j=1;j<=n;j++)
                        g[i][j].x
            =g[i][j].y=INF;
                tot
            =1;
                edge[tot].u
            =edge[tot].v=edge[tot].x=edge[tot].y=0;
                
            for(long i=1;i<=n;i++)
                    
            for(long j=1;j<=n;j++)
                        
            if(i!=j)
                        {
                            g[i][j].u
            =i;
                            g[i][j].v
            =j;
                            g[i][j].x
            =abs(v[i].x-v[j].x);
                            g[i][j].y
            =abs(v[i].y-v[j].y);
                            tot
            ++;
                            edge[tot]
            =g[i][j];
                        }
                
            //  Distance
                Qsort(1,tot);
                
            //for(long i=1;i<=tot;i++)printf("%ld %ld %ld %ld\n",edge[i].u,edge[i].v,edge[i].x,edge[i].y);
                ans=bsearch(1,tot);
                printf(
            "%.2lf\n",sqrt(edge[ans].x*edge[ans].x+edge[ans].y*edge[ans].y));
            return 0;
            }


            posted on 2010-02-20 14:14 lee1r 閱讀(280) 評論(0)  編輯 收藏 引用 所屬分類: 題目分類:圖論
            久久久久99精品成人片直播| 久久综合给合综合久久| 国产欧美一区二区久久| 91麻豆精品国产91久久久久久| 国产精品丝袜久久久久久不卡 | 久久99精品久久久久久不卡| 亚洲午夜精品久久久久久浪潮| 亚洲精品乱码久久久久久自慰| 国产高清美女一级a毛片久久w| 久久亚洲精品成人无码网站| 51久久夜色精品国产| 奇米影视7777久久精品| 思思久久99热免费精品6| 久久最新精品国产| 久久久久无码精品国产不卡| 伊人色综合久久天天网| 狠狠色综合网站久久久久久久| 无码超乳爆乳中文字幕久久 | 久久99精品久久久久婷婷| 最新久久免费视频| 欧洲国产伦久久久久久久| 久久免费小视频| 成人国内精品久久久久影院| 国产成人综合久久精品红| 国内精品久久久久久久coent| 国产亚洲综合久久系列| 久久精品人人做人人爽电影| 伊人热热久久原色播放www| 久久九九免费高清视频| 国产成人无码精品久久久久免费 | 色综合久久久久综合体桃花网| 久久久久亚洲AV综合波多野结衣| 99久久亚洲综合精品网站| 久久九九亚洲精品| 色成年激情久久综合| 91久久精品国产成人久久| 东京热TOKYO综合久久精品| 97久久超碰国产精品2021| 色综合合久久天天综合绕视看| 亚洲国产二区三区久久| 久久九九久精品国产免费直播|