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

            ACM___________________________

            ______________白白の屋
            posts - 182, comments - 102, trackbacks - 0, articles - 0
            <2010年8月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            常用鏈接

            留言簿(24)

            隨筆分類(332)

            隨筆檔案(182)

            FRIENDS

            搜索

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            MiYu原創, 轉帖請注明 : 轉載自 ______________白白の屋

            題目地址:
                     http://acm.hdu.edu.cn/showproblem.php?pid=1213
            題目描述:
            How Many Tables

            Time Limit: 
            2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
            Total Submission(s): 
            2337    Accepted Submission(s): 1033


            Problem Description
            Today 
            is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the friends know each other, and all the friends do not want to stay with strangers.

            One important rule 
            for this problem is that if I tell you A knows B, and B knows C, that means A, B, C know each other, so they can stay in one table.

            For example: If I tell you A knows B, B knows C, and D knows E, so A, B, C can stay 
            in one table, and D, E have to stay in the other one. So Ignatius needs 2 tables at least.
             

            Input
            The input starts with an integer T(
            1<=T<=25) which indicate the number of test cases. Then T test cases follow. Each test case starts with two integers N and M(1<=N,M<=1000). N indicates the number of friends, the friends are marked from 1 to N. Then M lines follow. Each line consists of two integers A and B(A!=B), that means friend A and friend B know each other. There will be a blank line between two cases.
             

            Output
            For each test 
            case, just output how many tables Ignatius needs at least. Do NOT print any blanks.
             

            Sample Input
            2
            5 3
            1 2
            2 3
            4 5

            5 1
            2 5
             

            Sample Output
            2
            4

            題目分析:
            并查集中的超級水題,  只要判斷集合的個數就可以了....................

            代碼如下:
            MiYu原創, 轉帖請注明 : 轉載自 ______________白白の屋

            #include 
            <iostream>
            using namespace std;
            typedef 
            struct {
                 
            int parent;
                 
            int cnt;   
            }Tset;  

            typedef 
            struct treeUFS{
                   
            public:
                          treeUFS(
            int n = 0):N(n+1) { set = new Tset[N];  for ( int i = 0; i != N; ++ i) 
                                                                              
            set[i].parent = i,set[i].cnt = 1
                                                    }
                          
            ~treeUFS() { delete [] set; };
                          
            int find ( int x ){ int r = x; while ( set[r].parent != r ) //循環結束,則找到根節點
                                                                r = set[r].parent; int i = x;
                                                         
            //本循環修改查找路徑中所有節點
                                                         while ( i != r) {   
                                                             
            int j = set[i].parent; set[i].parent = r; i = j;
                                                         } 
                                               
            return r;
                                            }
                          
            void init () { for ( int i = 0; i != N; ++ i) set[i].parent = i,set[i].cnt = 1;  }
                          
            int getSetCount ( int x ){ return set[ find(x) ].cnt; }
                          
            void Merge( int x,int y ){  x = find ( x );  y = find ( y );  
                                                       
            if ( x == y ) return;
                                                       
            if ( set[x].cnt > set[y].cnt ){
                                                            
            set[y].parent = x;
                                                            
            set[x].cnt += set[y].cnt;
                                                       }
                                                       
            else{   set[x].parent = y;
                                                               
            set[y].cnt += set[x].cnt;        
                                                           }
                                                    }
                   
            private:
                          Tset 
            *set;
                          
            int N;         
            }treeUFS;

            int main ()
            {
                
            int T;
                scanf ( 
            "%d",&T );
                
            while ( T -- )
                {
                       
            int N,M;
                       scanf ( 
            "%d%d",&N,&M );
                       treeUFS UFS ( N ); 
                       
            for ( int i = 1; i <= M; ++ i )
                       {
                             
            int a,b;
                             scanf ( 
            "%d%d",&a,&b );
                             UFS.Merge ( a,b ); 
                       }
                       
            int nCount = 0;
                       
            for ( int i = 1; i <= N; ++ i )
                       {
                            
            if ( UFS.find (i) == i )
                            {
                                 nCount 
            ++
                            }
                       } 
                       printf ( 
            "%d\n",nCount );
                }
                
            return 0
            }
            精品永久久福利一区二区| 久久婷婷五月综合色奶水99啪| 99久久人人爽亚洲精品美女| 色8激情欧美成人久久综合电| 久久精品国产99久久无毒不卡| 欧美日韩中文字幕久久久不卡| 99蜜桃臀久久久欧美精品网站| 欧美一区二区精品久久| 一本一本久久a久久综合精品蜜桃| 久久久久亚洲AV片无码下载蜜桃| 91超碰碰碰碰久久久久久综合| 久久久国产视频| 偷偷做久久久久网站| 日本久久久精品中文字幕| 亚洲va久久久久| 麻豆久久| 国产精品一区二区久久精品涩爱| 国产精品久久国产精品99盘| 久久精品国产久精国产思思| 日韩美女18网站久久精品| 久久精品草草草| 精品久久国产一区二区三区香蕉 | 一本色道久久综合| 久久99国产亚洲高清观看首页| 亚洲Av无码国产情品久久| 国产成人精品综合久久久| 精品多毛少妇人妻AV免费久久| 国内精品久久久久久99| 精品伊人久久大线蕉色首页| 精品国产日韩久久亚洲| 亚洲欧美一级久久精品| 色8久久人人97超碰香蕉987| 高清免费久久午夜精品| 久久精品国产亚洲AV嫖农村妇女 | 久久成人国产精品一区二区| 久久精品这里热有精品| 久久99精品国产99久久6男男| 精品国产一区二区三区久久久狼 | 伊人久久大香线蕉AV一区二区| 久久午夜无码鲁丝片午夜精品| 精品无码久久久久久国产|