洛谷题目链接:https://www.luogu.org/problemnew/show/2661

一道有很多种解法的题目

通过划归,发现就是求最小环

那么立即能想到的算法:1、Tarjan求强连通分量,最无脑

2、对于每个连通分量用Topo Sort,相当于剪去其他不在环上的边

不过用带权并查集也可以解决这道题目

首先发现只要一条边连接的两个点A、B在之前已经在一个集合中,则必定会形成一个环

那么难点就在于如何每次高效地求出环的大小

确实可以维护每个点到其根节点的距离,但每次merge操作要改变很多点的值

于是我们可以每次merge时只维护其到父节点的距离,不用有其他操作

而在find时再通过递归求出这个点到根节点的距离

Ex:有3个点A、B、C,f[A]=B,f[B]=C。在find前d[A]=cost(A,B),d[B]=cost(B,C),在递归时仅要d[A]+=d[f[A]]即可。

可以发现这样的处理和线段树中的lazy_tag运用了同样的思想

为了降低复杂度(只要不影响其他值的查找)在修改操作时不用对可能受影响的点全部进行修改,只维护最近点的数据,在查找操作时统一操作即可

Tips:1、在这样进行维护时,合并操作不能使用启发式合并,因为在查找时必须保证一条边两个节点间的父子关系不发生改变

   2、n个点n-1条边绝不意味着只可能出现一个环,很可能有多个连通分量,从而出现多个环

 #include <bits/stdc++.h>

 using namespace std;
int n,f[],d[]; int find(int x)
{
if(f[x]!=x) //对d进行维护
{
int root=find(f[x]);
d[x]+=d[f[x]];
return f[x]=root;
}
else return x;
} int main()
{
cin >> n;
for(int i=;i<=n;i++) f[i]=i,d[i]=; int res=<<;
for(int i=;i<=n;i++)
{
int x;cin >> x;
int px=find(x),py=find(i); if(px==py) res=min(res,d[i]+d[x]+);
else f[i]=x,d[i]=; //只能使用朴素合并方式
}
cout << res; return ;
}

[NOIP2015] D1T2 信息传递的更多相关文章

  1. 计蒜客NOIP模拟赛(3) D1T2 信息传递

    一个数据包在一个无向网络中传递.在时刻0,该数据包将依照特定的概率随机抵达网络中的某个节点.网络可以看做一张完全带权无向图,包含N个节点,若t时刻数据包在节点i,则在t+1时刻,数据包被传递到节点j的 ...

  2. UOJ #146. 【NOIP2015】信息传递 连通分量 tarjan模板题

    http://uoj.ac/problem/146 题解:强连通分量 tarjan模板题.同时试了一下codeblock #include<bits/stdc++.h> using nam ...

  3. 【NOIP2015】信息传递(强连通分量)

    题意:找一张图中的最小环 O(n) 思路:强连通分量tarjan即可 注意环中节点数>1 ..]of longint; n,i,ans,tot,id,top,time,x:longint; pr ...

  4. $Noip2015/Luogu2661$ 信息传递 并查集

    Luogu $Description$ 给定一个有向图,每个点只有一条出边.求图里的最小环. $Sol$ 使得这个题不难的地方就在于每个点只有一条出边叭. 一边连边一边更新答案.首先当然是初始$f[i ...

  5. [NOIP2015]信息传递

    [NOIP2015]信息传递[问题描述]有

  6. codevs 4511 信息传递(NOIP2015 day1 T2)

    4511 信息传递 NOIP2015 day1 T2 时间限制: 1 s 空间限制: 128000 KB 传送门 题目描述 Description 有个同学(编号为 1 到)正在玩一个信息传递的游戏. ...

  7. LOJ2421 NOIP2015 信息传递 【tarjan求最小环】

    LOJ2421 NOIP2015 信息传递 LINK 题目大意就是给你一个有向图,求最小环 有一个很奇妙的性质叫做每个点只有一条出边 然后我们考虑对每个强联通分量进行考虑 发现每个强联通分量内的边数一 ...

  8. [NOIP2015] 提高组 洛谷P2661 信息传递

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  9. 【 NOIP2015 DAY1 T2 信息传递】带权并查集

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

随机推荐

  1. 【bzoj】1717 [Usaco2006 Dec]Milk Patterns 产奶的模式

    [算法]后缀数组 [题解]后缀数组 由于m太大,先离散化. 然后处理SA和LCP. 最后用单调队列处理即可. 注意实际上队列头尾长度限制是K-1. 删队尾不要删过头 i≥K才能开始统计答案. #inc ...

  2. BTA 常问的 Java基础40道常见面试题及详细答案(山东数漫江湖))

    八种基本数据类型的大小,以及他们的封装类 引用数据类型 Switch能否用string做参数 equals与==的区别 自动装箱,常量池 Object有哪些公用方法 Java的四种引用,强弱软虚,用到 ...

  3. js_判断当前url是否合法http(s)

    alert(checkURL('http:555')); //false function checkURL(URL) { var str = URL, Expression = /http(s)?: ...

  4. querySelector()与querySelectorAll()

    1.querySelector() 参数:css选择器 返回匹配指定css选择器元素的第一个子元素 2.querySelectorAll() 参数:css选择器 返回匹配指定css选择器的所有元素

  5. mysql cast函数

    CAST函数语法规则是:Cast(字段名 as 转换的类型 ),其中类型可以为: CHAR[(N)] 字符型 DATE 日期型DATETIME 日期和时间型DECIMAL float型SIGNED i ...

  6. 虚拟机出现intel vt -x 处于禁用状态打不开处理方式

    处理方式 . 1 进入bios 以华硕主板为例 进入高级模式找到cpu虚拟技术 打开虚拟技术支持 其它电脑找到这个

  7. SD卡 模拟SPI总线控制流程

    SD卡为移动设备提供了安全的,大容量存储解决方法.它本身可以通过两种总线模式和MCU进行数据传输,一种是称为SD BUS的4位串行数据模式,另一种就是大家熟知的4线SPI Bus模式.一些廉价,低端的 ...

  8. Linux实际用户(组)ID,有效用户(组)ID,设置用户(组)ID

    实际用户(组)ID: 标识用户是谁,这两个字段在登录时取自口令文件中的登录项. 有效用户(组)ID: 决定了对文件的访问权限,通常有效用户(组)ID等于实际用户(组)ID,谁运行有效ID就等于谁的实际 ...

  9. MinnowBoard

    MinnowBoard https://github.com/RafaelRMachado/MinnowBoard https://github.com/RafaelRMachado https:// ...

  10. c json实战引擎四 , 最后❤跳跃

    引言  - 以前那些系列 长活短说, 写的最终 scjson 纯c跨平台引擎, 希望在合适场景中替代老的csjon引擎, 速度更快, 更轻巧. 下面也是算一个系列吧. 从cjson 中得到灵感, 外加 ...