【LA 3027 Corporative Network】

·一些很可爱的询问和修改,放松地去用并查集解决。

·英文题,述大意:

输入n(5<=n<=20000)表示树有n个节点,并且会EOF结束地读入不超过 20000个操作,一共有两种:

   ①I v u:表示将v的父亲节点设置为u(在这之前v没有爸爸),边权设置为abs(v-u)%1000。

   ②E u:表示询问u到当前它所在树的根节点的距离。

·分析:

     为了记录当前一系列加边操作后所有的点的位置情况(因为你随时可能回答询问啊),根据这道题的点关系特点[只在乎点和其根节点的信息],我们选择并查集来加以维护。

     然后我们只需要在标准的FindFather函数的回溯过程里面加入边权的累积,这样一次函数就可以既完成路径压缩,又维护了沿途所有点各自到根节点的距离(就是边权和)。

     然后这么短的题解让我想起了网络上的人们常常使用的一句题解推托之词:“哎呀,其他的搞一搞就出来了”。但是这道题真是这么单纯。OK。

 1 #include<stdio.h>
 2 #define go(i,a,b) for(int i=a;i<=b;i++)
 3 int T,n,fa[20004],d[20004];char c;
 4 int A(int a){return a>0?a:-a;}
 5 int find(int u)
 6 {
 7     if(u==fa[u])return u;int Fa=find(fa[u]);
 8     d[u]+=d[fa[u]];return fa[u]=Fa;
 9 }
10 int main()
11 {
12     scanf("%d",&T);while(T--&&scanf("%d",&n))
13     {
14         go(u,1,n)d[fa[u]=u]=0;int u,v;
15         while(scanf(" %c",&c),c!=‘O‘)
16         {
17             if(c==‘I‘)scanf("%d%d",&v,&u),fa[v]=u,d[v]=A(v-u)%1000;
18             if(c==‘E‘)scanf("%d",&u),fa[u]=find(u),printf("%d\n",d[u]);
19         }
20     }
21     return 0;
22 }//Paul_Guderian
明天当孤独袭来时我不会再流一滴泪,我会用歌声抹去那创痛的灰烬。—————汪峰《明天》
时间: 2024-10-27 09:53:18

【LA 3027 Corporative Network】的相关文章

[LA] 3027 - Corporative Network [并查集]

A very big corporation is developing its corporative network. In the beginning each of the N enterprises of the corporation, numerated from 1 to N, organized its own computing and telecommunication center. Soon, for amelioration of the services, the

(DS 《算法竞赛入门经典》)LA 3027 Corporative Network(查询某一个节点到根节点之间的距离)

题目大意: 查询某一个节点到根节点之间的距离 解题思路: 加权并查集问题.之前做的题目是"查看两个或多个节点是否在同一个集合下",现在的题目是"查询某个节点到 根节点之间的距离".之前只需要使用到father[x]这个数组,用来表示x的父亲节点是谁.现在引入dist[x]数组,用来记录 x节点到根节点的距离 1)在并查集中,根节点不懂,其他节点都可以动. A very big corporation is developing its corporative net

LA 3027 Corporative Network(并查集,求某个节点到根节点的距离)

A very big corporation is developing its corporative network. In the beginning each of the N enterprisesof the corporation, numerated from 1 to N, organized its own computing and telecommunication center.Soon, for amelioration of the services, the co

并查集(路径更新) LA 3027 Corporative Network

题目传送门 题意:训练指南P192 分析:主要就是一个在路径压缩的过程中,更新点i到根的距离 #include <bits/stdc++.h> using namespace std; const int N = 2e4 + 5; struct DSU { int rt[N], d[N]; void init(void) { memset (rt, -1, sizeof (rt)); memset (d, 0, sizeof (d)); } int Find(int x) { if (rt[x

LA 3027 Corporative Network

这题感觉和 POJ 1988 Cube Stacking 很像,在路径压缩的同时递归出来的时候跟新distant数组 1 //#define LOCAL 2 #include <algorithm> 3 #include <cstdio> 4 using namespace std; 5 6 const int maxn = 20000 + 10; 7 int parent[maxn], distant[maxn]; 8 9 int GetParent(int a) 10 { 11

LA 3027 Corporative Network(并查集)

有n个点,一开始都是孤立的,然后有I,E两种操作 I        u v,把u的父节点设为v,距离为abs(u-v) % 1000,保证u之前没有父节点 E      询问u到根节点的距离 #include<iostream> #include<cmath> using namespace std; const int maxn=2e4+5; int par[maxn],dis[maxn]; void init(int n) { for(int i=0;i<=n;i++)

【暑假】[实用数据结构]UVAlive 3027 Corporative Network

UVAlive 3027 Corporative Network 题目:   Corporative Network Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 3450   Accepted: 1259 Description A very big corporation is developing its corporative network. In the beginning each of the N ent

3027 - Corporative Network

3027 - Corporative Network 思路:并查集: cost记录当前点到根节点的距离,每次合并时路径压缩将cost更新. 1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<math.h> 6 #include<stack> 7 #include<set> 8 #inc

[2016-03-19][UVALive][3027][Corporative Network]

时间:2016-03-19 13:24:23 星期六 题目编号:[2016-03-19][UVALive][3027][Corporative Network] 题目大意:给定n个节点,I u v表示把u节点的父节点设置为v,距离为|u-v|%1000,E u表示询问u到根节点的距离,给定若干个I E操作,输出相应答案 分析:带权并查集 方法:d[maxn] 维护到父节点的距离,每次询问的时候,把当前节点压缩到根节点输出对应距离即可 #ifdef _WORK_ #include <algorit