<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 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    并查集 (2) - PKU1611 The Suspects

    Posted on 2007-07-15 11:12 ZelluX 閱讀(482) 評(píng)論(0)  編輯  收藏 所屬分類: Algorithm
    突然想通了一開始一直超時(shí)的原因。
    每次我都是把新的suspect并入第一個(gè)元素所在的集合中,但是由于使用了優(yōu)化后的并集操作,有可能是第一個(gè)元素所在的集合并入了新的suspect所在的集合,也就是說此后last變量并沒有指向第一個(gè)元素所在集合的跟結(jié)點(diǎn)。于是在Union方法中,parent[root1]可能得到一個(gè)正整數(shù),并導(dǎo)致Find方法死循環(huán)(根結(jié)點(diǎn)的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;
    }


    主站蜘蛛池模板: 爽爽爽爽爽爽爽成人免费观看| 亚洲不卡av不卡一区二区| 亚洲乱码卡一卡二卡三| 久久免费国产视频| 亚洲成人动漫在线| 亚洲成人免费在线| 亚洲天堂电影在线观看| 国产麻豆视频免费观看| 亚洲一区AV无码少妇电影| 性感美女视频在线观看免费精品| 中文字幕在线观看亚洲视频| 四虎影院免费视频| 美女无遮挡免费视频网站| 免费人成在线观看视频播放| 成年网站免费入口在线观看| 亚洲色婷婷六月亚洲婷婷6月| 男女一边桶一边摸一边脱视频免费| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 亚洲阿v天堂在线| 久久国产乱子伦精品免费不卡| 在线免费观看亚洲| 亚洲免费综合色在线视频| 亚洲AV无码专区国产乱码不卡| 一级毛片直播亚洲| 你懂得的在线观看免费视频| 亚洲综合色一区二区三区小说| 我想看一级毛片免费的| 四虎影视在线看免费观看| 久久久久亚洲AV无码专区首| 亚洲第一成年免费网站| 特级毛片免费观看视频| 亚洲国产日韩一区高清在线| 性短视频在线观看免费不卡流畅 | 国产亚洲精品看片在线观看 | 久久久久国产精品免费看| 亚洲综合偷自成人网第页色| 亚洲国产精品人人做人人爱| 在线免费观看国产| 亚洲av永久中文无码精品综合| 亚洲人成无码网站| 成全视频免费高清 |