• <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)  編輯 收藏 引用 所屬分類: 題目分類:圖論
            国产精品一区二区久久不卡| 国产成人精品久久免费动漫| 亚洲综合熟女久久久30p| 久久久久国产一区二区| 国产毛片久久久久久国产毛片| 久久精品视频网| 狠狠色丁香婷婷综合久久来| 国产精品久久波多野结衣| 午夜久久久久久禁播电影 | 国内精品伊人久久久久影院对白| 久久99精品国产麻豆婷婷| 亚洲狠狠久久综合一区77777| 777久久精品一区二区三区无码| 91精品无码久久久久久五月天| 久久99精品国产麻豆蜜芽| 久久99国产精品久久99小说| 久久精品无码专区免费青青| A级毛片无码久久精品免费| 无码任你躁久久久久久老妇| 无码人妻久久久一区二区三区| 久久er热视频在这里精品| 亚洲精品无码久久毛片| 狠狠久久亚洲欧美专区 | 久久久久免费看成人影片| 亚洲乱码精品久久久久..| 99国产精品久久| 日韩美女18网站久久精品| 国产亚洲成人久久| 国产亚洲色婷婷久久99精品91 | 久久综合丝袜日本网| 亚洲欧美国产日韩综合久久| 国产精品久久99| 伊人久久大香线蕉av一区| 久久久久婷婷| 精品久久久久久综合日本| 午夜精品久久久久久久| 亚洲国产日韩欧美久久| 一本久久久久久久| 韩国免费A级毛片久久| 久久人人爽人人爽人人爽| 亚洲欧美日韩精品久久亚洲区|