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

            一本久久a久久精品vr综合| 久久99热国产这有精品| 久久精品九九亚洲精品天堂| 亚洲色欲久久久综合网| 思思久久99热只有频精品66| 久久久久久av无码免费看大片| 一本一道久久精品综合| 久久噜噜电影你懂的| 国产精品久久久久影院色| 国内精品久久久久久99蜜桃 | 久久国产精品久久久| 国产精品免费看久久久| 国产精品禁18久久久夂久| 91精品国产高清久久久久久io | 精品国产乱码久久久久久1区2区| 亚洲va久久久噜噜噜久久| 久久精品亚洲中文字幕无码麻豆| 72种姿势欧美久久久久大黄蕉| 情人伊人久久综合亚洲| 久久精品国产黑森林| 久久九九久精品国产免费直播| 色婷婷综合久久久中文字幕| 精品蜜臀久久久久99网站| 久久精品国产72国产精福利| 午夜精品久久久久久影视riav| 久久亚洲私人国产精品vA| 亚洲国产精品久久久久网站| 少妇被又大又粗又爽毛片久久黑人| 国产69精品久久久久APP下载| 久久婷婷五月综合97色 | 精品无码久久久久久久动漫| 欧美国产成人久久精品| 97超级碰碰碰久久久久| 日批日出水久久亚洲精品tv| 色妞色综合久久夜夜| 理论片午午伦夜理片久久| 久久99精品久久只有精品| 一本综合久久国产二区| 久久精品这里热有精品| 亚洲AV无码1区2区久久 | 伊人久久亚洲综合影院|