UVALive 3027(并查集)

Posted SomnusMistletoe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVALive 3027(并查集)相关的知识,希望对你有一定的参考价值。

题意:某公司的各企业群要建立联系,I i j 表示企业i与企业j建立联系,并且以企业j为中心(并查集中的父亲)(企业j为暂时的中心企业),E i 表示查询企业 i 距离此时的中心企业的距离。各企业间的距离规定:企业i 与 企业j 间距离为|i - j| % 1000。

分析:改造并查集中的find函数,每次查询i企业到中心企业的距离时,不断向上依次寻找他的父亲,直到找到中心企业为止,不断累加现企业与其父亲企业间的距离即可。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cctype>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<iostream>
 7 #include<sstream>
 8 #include<iterator>
 9 #include<algorithm>
10 #include<string>
11 #include<vector>
12 #include<set>
13 #include<map>
14 #include<deque>
15 #include<queue>
16 #include<stack>
17 #include<list>
18 #define fin freopen("in.txt", "r", stdin)
19 #define fout freopen("out.txt", "w", stdout)
20 #define pr(x) cout << #x << " : " << x << "   "
21 #define prln(x) cout << #x << " : " << x << endl
22 typedef long long ll;
23 typedef unsigned long long llu;
24 const int INT_INF = 0x3f3f3f3f;
25 const int INT_M_INF = 0x7f7f7f7f;
26 const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
27 const ll LL_M_INF = 0x7f7f7f7f7f7f7f7f;
28 const double pi = acos(-1.0);
29 const double EPS = 1e-6;
30 const int dx[] = {0, 0, -1, 1};
31 const int dy[] = {-1, 1, 0, 0};
32 const ll MOD = 1e9 + 7;
33 const int MAXN = 20000 + 10;
34 const int MAXT = 10000 + 10;
35 using namespace std;
36 int fa[MAXN];
37 int ans;
38 int find(int v)
39 {
40     ans += abs(fa[v] - v) % 1000;
41     if(fa[v] == v)
42         return fa[v];
43     else find(fa[v]);
44 }
45 int main()
46 {
47     int T;
48     scanf("%d", &T);
49     while(T--)
50     {
51         int N;
52         scanf("%d", &N);
53         char c;
54         for(int i = 1; i <= N; ++i)
55             fa[i] = i;
56         while(scanf("%c", &c) == 1)
57         {
58             if(c == O) break;
59             if(c == E)
60             {
61                 int x;
62                 scanf("%d", &x);
63                 ans = 0;
64                 int t = find(x);
65                 printf("%d\n", ans);
66             }
67             else if(c == I)
68             {
69                 int a, b;
70                 scanf("%d%d", &a, &b);
71                 fa[a] = b;
72             }
73         }
74     }
75     return 0;
76 }

 

以上是关于UVALive 3027(并查集)的主要内容,如果未能解决你的问题,请参考以下文章

LA 3027 合作网络

UVA 3027 Corporative Network 带权并查集

UVaLive 7456 Least Crucial Node (并查集+暴力)

UVALive 4730 线段树+并查集

UVALive 6091 并查集简单应用

UVALive 6910 Cutting Tree(并查集应用)