<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 403, comments - 310, trackbacks - 0, articles - 7
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    并查集 (2) - PKU1611 The Suspects

    Posted on 2007-07-15 11:12 ZelluX 閱讀(482) 評論(0)  編輯  收藏 所屬分類: Algorithm
    突然想通了一開始一直超時的原因。
    每次我都是把新的suspect并入第一個元素所在的集合中,但是由于使用了優化后的并集操作,有可能是第一個元素所在的集合并入了新的suspect所在的集合,也就是說此后last變量并沒有指向第一個元素所在集合的跟結點。于是在Union方法中,parent[root1]可能得到一個正整數,并導致Find方法死循環(根結點的parent為正)

    后來把Find方法放到Union方法中,問題解決了。

    #include <iostream>

    using namespace std;

    const int DEFAULT_SIZE = 100;

    class UFSets
    {
    private:
        
    int *parent;
        
    int size;
    public:
        UFSets(
    int s = DEFAULT_SIZE);
        
    ~UFSets() { delete [] parent; }
        
    void Union(int root1, int root2);
        
    int Find(int x);
        
    void Clear(int n);
    };

    UFSets::UFSets(
    int s)
    {
        size 
    = s;
        parent 
    = new int[size + 1];
        
    for (int i = 0; i <= size; i++)
            parent[i] 
    = -1;
    }

    int UFSets::Find(int x)
    {
        
    int result = x;
        
    while (parent[result] >= 0)
            result 
    = parent[result];
        
    return result;
    }

    void UFSets::Union(int root1, int root2)
    {
        
    // The old version didn't contain the following 3 setences.
        root1 = Find(root1);
        root2 
    = Find(root2);
        
    if (root1 == root2) return;

        
    int temp = parent[root1] + parent[root2];
        
    if (parent[root2] < parent[root1])
        {
            parent[root1] 
    = root2;
            parent[root2] 
    = temp;
        }
        
    else
        {
            parent[root2] 
    = root1;
            parent[root1] 
    = temp;
        }
    }

    void UFSets::Clear(int n)
    {
        
    for (int i = 0; i < n; i++)
            parent[i] 
    = -1;
    }

    int main()
    {
        UFSets sets(
    30000);
        
    int n, m;
        
    while (true)
        {
            cin 
    >> n >> m;
            
    if (n == 0break;
            sets.Clear(n);
            
    for (int i = 0; i < m; i++)
            {
                
    int t;
                cin 
    >> t;
                
    int last, x;
                cin 
    >> last;
                last 
    = sets.Find(last);
                
    for (int j = 1; j < t; j++)
                {
                    cin 
    >> x;
                    sets.Union(last, x);
                    
    // int temp = sets.Find(x);
                    
    // if (temp != last)
                    
    //     sets.Union(last, temp);
                }
            }
            
    int result = 1;
            
    int target = sets.Find(0);
            
    for (int i = 1; i < n; i++)
                
    if (sets.Find(i) == target)
                    result 
    ++;
            cout 
    << result << endl;
        }
        
    return 0;
    }


    主站蜘蛛池模板: 亚洲精品无码mv在线观看网站| 成人五级毛片免费播放| 国产av无码专区亚洲av桃花庵| 老司机午夜性生免费福利 | 华人在线精品免费观看| 亚洲日产韩国一二三四区| 国产在线国偷精品免费看| 亚洲精品国产福利在线观看| 99在线视频免费| 亚洲乱码中文字幕小综合| 久久久www成人免费毛片| 亚洲精品无码日韩国产不卡av| 国产精品国产午夜免费福利看 | 久久久久一级精品亚洲国产成人综合AV区| 亚洲第一综合天堂另类专| 国产精品va无码免费麻豆| 四虎影视在线看免费观看| 亚洲中文字幕无码一区| 亚洲国产AV无码一区二区三区| 精品剧情v国产在免费线观看 | 久久久受www免费人成| 久久久无码精品亚洲日韩蜜臀浪潮| 97在线视频免费| 亚洲第一成年网站视频| 国产专区一va亚洲v天堂| 久久aⅴ免费观看| 亚洲狠狠色丁香婷婷综合| 精品亚洲一区二区三区在线观看 | www.亚洲精品| a毛片免费在线观看| 亚洲AV综合色区无码二区偷拍| 日韩精品视频免费网址| 久久免费视频一区| 亚洲卡一卡2卡三卡4麻豆| 国产a级特黄的片子视频免费| 日本道免费精品一区二区| 亚洲日本va在线观看| 亚洲国产一成久久精品国产成人综合 | 人人玩人人添人人澡免费| 亚洲乱人伦中文字幕无码| 亚洲精品无码Av人在线观看国产 |