• <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
            }
            国内精品久久国产| 狼狼综合久久久久综合网| 婷婷久久综合九色综合98| 精品久久久久久久| 欧美精品一本久久男人的天堂| 久久不见久久见免费影院www日本| 国产69精品久久久久9999| 一本综合久久国产二区| 久久丫精品国产亚洲av| 国产免费福利体检区久久| 超级97碰碰碰碰久久久久最新| AV色综合久久天堂AV色综合在 | 久久无码人妻精品一区二区三区 | 久久亚洲中文字幕精品一区| 久久久av波多野一区二区| 久久久亚洲精品蜜桃臀| 精品国产乱码久久久久久1区2区 | 久久久综合香蕉尹人综合网| 国内精品久久久久影院老司| 大美女久久久久久j久久| 天天躁日日躁狠狠久久| 亚洲国产成人精品女人久久久| …久久精品99久久香蕉国产| 久久综合九色欧美综合狠狠| 91精品免费久久久久久久久| 久久天堂AV综合合色蜜桃网| 亚洲&#228;v永久无码精品天堂久久 | 亚洲一区中文字幕久久| 欧美大香线蕉线伊人久久| 一本久久a久久精品综合香蕉| 99久久国产综合精品五月天喷水| 亚洲国产精品无码久久98| 日本高清无卡码一区二区久久 | 久久综合九色综合精品| 国产精品久久久亚洲| 欧美黑人又粗又大久久久| 伊人久久大香线蕉亚洲| 亚洲国产美女精品久久久久∴| 97精品依人久久久大香线蕉97| 久久人与动人物a级毛片| 日本五月天婷久久网站|