• hihocoder1066 并查集


    并查集可实现集合的快速合并与查找操作。路径压缩后的并查集可将每次合并或者查找的操作复杂度降低到O(1).

    我的代码:

     1 #include <iostream>
     2 #include <string>
     3 #include <map>
     4 
     5 using namespace std;
     6 
     7 #define MAXN 100005
     8 
     9 map<string, int> mp;
    10 
    11 struct unionFindSet
    12 {
    13     int st[MAXN];
    14     void init()
    15     {
    16         for(int i=0; i<MAXN; ++i)   st[i] = i;
    17     }
    18     int findSet(int x)
    19     {
    20         if(x==st[x]) return x;
    21         return st[x] = findSet(st[x]); //路径压缩
    22     }
    23     void unionSet(int x, int y)
    24     {
    25         int sx = findSet(x), sy = findSet(y);
    26         st[sx] = sy;
    27     }
    28 }ufs;
    29 
    30 int main()
    31 {
    32     int cnt, n;
    33     bool op;
    34     string name1, name2;
    35     while(cin>>n)
    36     {
    37         mp.clear();
    38         cnt = 0;
    39         ufs.init();
    40         while(n--)
    41         {
    42             cin>>op>>name1>>name2;
    43             if(mp.find(name1)==mp.end())    mp[name1] = cnt++;
    44             if(mp.find(name2)==mp.end())    mp[name2] = cnt++;
    45             if(op)
    46             {
    47                 int s1 = ufs.findSet(mp[name1]), s2 = ufs.findSet(mp[name2]);
    48                 cout<<(s1==s2?"yes":"no")<<endl;
    49             }
    50             else
    51             {
    52                 ufs.unionSet(mp[name1], mp[name2]);
    53             }
    54         }
    55     }
    56     return 0;
    57 }

    题目链接:http://hihocoder.com/problemset/problem/1066

  • 相关阅读:
    oracle 误删除表的几种恢复方法
    解决js在alert或者断点调试时才能赋值
    常用的Debug方式
    字节对齐
    CWnd::SetWindowPos的注意事项
    网络模块代码调试要点
    stub和mock
    全局变量的缺陷
    SVN切换地址
    C/C++如何得到int型最大值
  • 原文地址:https://www.cnblogs.com/pczhou/p/4296624.html
Copyright © 2020-2023  润新知