• <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)  編輯 收藏 引用 所屬分類: 題目分類:圖論
            久久综合亚洲色HEZYO社区| 深夜久久AAAAA级毛片免费看| 久久精品无码专区免费东京热 | 99久久国产热无码精品免费| 久久综合综合久久综合| 久久综合久久综合久久| 欧美亚洲另类久久综合婷婷| 色婷婷综合久久久久中文一区二区| 国产精品久久久久久久久鸭| 欧美国产精品久久高清| 久久er99热精品一区二区| 亚洲精品国产综合久久一线| 久久91精品国产91久久小草| 久久综合色老色| 狠狠色丁香婷婷综合久久来来去| 久久乐国产综合亚洲精品| 国产91久久综合| 国产欧美久久一区二区| 久久人人爽人人爽人人av东京热 | 久久天天躁狠狠躁夜夜avapp | 三级韩国一区久久二区综合 | 亚洲国产精品综合久久一线| 久久久久四虎国产精品| 精品久久久久久久久午夜福利| 性做久久久久久久久老女人| 99久久亚洲综合精品网站| 国产产无码乱码精品久久鸭| 国内精品人妻无码久久久影院导航| 久久国产乱子伦精品免费强| 人妻精品久久久久中文字幕一冢本| 欧美一区二区久久精品| 亚洲日本久久久午夜精品| 久久亚洲国产成人影院网站 | 亚洲精品蜜桃久久久久久| 色欲综合久久躁天天躁| 久久天天躁狠狠躁夜夜2020老熟妇| 99热都是精品久久久久久| 久久九九亚洲精品| 美女写真久久影院| 久久精品女人天堂AV麻| 欧美与黑人午夜性猛交久久久|