• <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 閱讀(283) 評論(0)  編輯 收藏 引用 所屬分類: 題目分類:圖論
            国产精品亚洲综合专区片高清久久久 | 久久久久亚洲AV无码专区体验| 无码精品久久一区二区三区| 一日本道伊人久久综合影| 亚洲级αV无码毛片久久精品| 亚洲国产精品无码久久一线 | 久久久久亚洲精品男人的天堂| 伊人久久大香线蕉精品不卡 | 久久笫一福利免费导航 | 99精品久久精品| 午夜精品久久久久久久无码| 久久久久久久久久久久中文字幕 | 2020久久精品国产免费| 久久久久久av无码免费看大片 | 国内精品久久久久久中文字幕| 国产美女亚洲精品久久久综合| 久久久久综合网久久| 伊人久久综合精品无码AV专区 | 亚洲一区中文字幕久久| 国产激情久久久久久熟女老人| 久久精品18| 国产精品久久影院| 亚洲午夜久久久久妓女影院| 国内精品久久久久久久涩爱| 91久久婷婷国产综合精品青草 | 亚洲中文字幕无码久久2020| 理论片午午伦夜理片久久| 久久国产精品-久久精品| 少妇高潮惨叫久久久久久| 中文成人久久久久影院免费观看| 国产成人综合久久精品尤物| 久久发布国产伦子伦精品| 亚洲中文字幕无码久久2017| 久久综合五月丁香久久激情| 狠狠色丁香婷婷综合久久来来去 | 国产91色综合久久免费| 亚洲色大成网站www久久九| 一本色道久久综合| 久久综合亚洲色一区二区三区| 精品久久久久成人码免费动漫| 亚洲国产视频久久|