• <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>

            我住包子山

            this->blog.MoveTo("blog.baozishan.in")

            zju1942解題報告

            這道題我用了Kruscal+并查集算的
            之前并查集用的不對,所以一直WA
            并查集代碼來自我的那本寫數據結構與算法分析c++版 knuth的徒孫的網站

            #include <cstdio>
            #include 
            <vector>
            #include 
            <cmath>
            #include 
            <algorithm>
            using namespace std;

            #ifndef DISJ_SETS_H
            #define DISJ_SETS_H

            // DisjSets class
            //
            // CONSTRUCTION: with int representing initial number of sets
            //
            // ******************PUBLIC OPERATIONS*********************
            // void union( root1, root2 ) --> Merge two sets
            // int find( x )              --> Return set containing x
            // ******************ERRORS********************************
            // No error checking is performed

            #include 
            <vector>
            using namespace std;

            /**
             * Disjoint set class.
             * Use union by rank and path compression.
             * Elements in the set are numbered starting at 0.
             
            */

            class DisjSets
            {
              
            public:
                
            explicit DisjSets( int numElements );

                
            int find( int x ) const;
                
            int find( int x );
                
            void unionSets( int root1, int root2 );

              
            private:
                vector
            <int> s;
            }
            ;

            #endif


            /**
             * Construct the disjoint sets object.
             * numElements is the initial number of disjoint sets.
             
            */

            DisjSets::DisjSets( 
            int numElements ) : s( numElements )
            {
                
            forint i = 0; i < s.size( ); i++ )
                    s[ i ] 
            = -1;
            }


            /**
             * Union two disjoint sets.
             * For simplicity, we assume root1 and root2 are distinct
             * and represent set names.
             * root1 is the root of set 1.
             * root2 is the root of set 2.
             
            */

            void DisjSets::unionSets( int root1, int root2 )
            {
            //    if( s[ root2 ] < s[ root1 ] )  // root2 is deeper
                    s[ root1 ] = root2;        // Make root2 new root
                
            //else
                
            //{
                
            //    if( s[ root1 ] == s[ root2 ] )
                
            //        s[ root1 ]--;          // Update height if same
                
            //    s[ root2 ] = root1;        // Make root1 new root
                
            //}
            }



            /**
             * Perform a find.
             * Error checks omitted again for simplicity.
             * Return the set containing x.
             
            */

            int DisjSets::find( int x ) const
            {
                
            if( s[ x ] < 0 )
                    
            return x;
                
            else
                    
            return find( s[ x ] );
            }



            /**
             * Perform a find with path compression.
             * Error checks omitted again for simplicity.
             * Return the set containing x.
             
            */

            int DisjSets::find( int x )
            {
                
            if( s[ x ] < 0 )
                    
            return x;
                
            else
                    
            return s[ x ] = find( s[ x ] );
            }



            struct Gedge
            {
                
            int startnumber;
                
            int endnumber;
                
            double weight;
                Gedge(
            int s,int e,double w):startnumber(s),endnumber(e),weight(w){}
            }
            ;
            struct Gnode
            {
                
            int x;
                
            int y;
                Gnode(
            int xx,int yy):x(xx),y(yy){}
                Gnode():x(
            0),y(0){}
                
            static double dis(const Gnode & n1, const Gnode & n2)
                
            {
                    
            double d1=(n1.x-n2.x)*(n1.x-n2.x)+(n1.y-n2.y)*(n1.y-n2.y);
                    
            return d1;
                }


            }
            ;

            bool comp(const Gedge& g1,const Gedge& g2)
            {
                
            return g1.weight<g2.weight;
            }

            vector
            <Gedge> edgeV;
            Gnode nodeArray[
            201];
            int main()
            {
                
            int n=0,cnt=1;
                
            while(scanf("%d",&n)!=EOF)
                
            {
                    
            if(n==0)break;
                    
            for(int i=0;i<n;i++)
                    
            {
                        scanf(
            "%d %d",&nodeArray[i].x,&nodeArray[i].y);
                    }

                    
            for(int i=0;i<n-1;i++)
                    
            {
                        
            for(int j=i+1;j<n;j++)
                        
            {
                            edgeV.push_back(Gedge(i,j,Gnode::dis(nodeArray[i],nodeArray[j])));
                        }

                    }

                    DisjSets ds(n
            +1);
                    
            double minstep=0;
                    sort(edgeV.begin(),edgeV.end(),comp);
                    
            while(ds.find(0)!=ds.find(1))
                    
            {
                        minstep
            =edgeV[0].weight;
                        
            int a=ds.find(edgeV[0].startnumber);
                        
            int b=ds.find(edgeV[0].endnumber);
                        
            if(a!=b)
                        
            {
                            ds.unionSets(a,b);               
                        }

                        edgeV.erase(edgeV.begin());
                    }

                    printf(
            "Scenario #%d\nFrog Distance = %.3lf\n\n",cnt++,sqrt(minstep));
                    edgeV.clear();
                }

            }

            posted on 2007-07-28 21:04 Gohan 閱讀(451) 評論(0)  編輯 收藏 引用 所屬分類: C++Practise

            久久综合精品国产二区无码| 国内精品人妻无码久久久影院| 久久综合色之久久综合| 精品国产日韩久久亚洲 | 日本加勒比久久精品| 久久国产乱子伦精品免费午夜| 日韩亚洲国产综合久久久| 久久中文骚妇内射| 久久久久久极精品久久久 | 久久青青草原综合伊人| 久久人人爽人人澡人人高潮AV| 亚洲午夜久久久影院伊人| 亚洲国产精品久久| 久久久久高潮毛片免费全部播放| 国产高清美女一级a毛片久久w| 欧美喷潮久久久XXXXx| 亚洲精品WWW久久久久久 | 久久久久久精品免费免费自慰| 久久青草国产手机看片福利盒子| 伊人久久大香线蕉av不变影院 | 日韩人妻无码精品久久免费一| 久久综合九色综合久99| 国产巨作麻豆欧美亚洲综合久久| 热re99久久精品国99热| 久久99精品久久久大学生| 久久影院久久香蕉国产线看观看| 青青草原综合久久大伊人精品| 97久久精品午夜一区二区| 日韩人妻无码精品久久免费一| 伊人久久大香线蕉无码麻豆| 人妻少妇精品久久| 久久久噜噜噜久久| 久久精品中文字幕一区| 久久精品无码免费不卡| 久久久久九九精品影院| 久久影视国产亚洲| 伊人色综合久久天天网| 久久久久久久免费视频| 久久婷婷五月综合成人D啪 | 精品久久久久久久久中文字幕| 国产婷婷成人久久Av免费高清|