[NOIP2015] D1T2 信息传递
洛谷题目链接: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 信息传递的更多相关文章
- 计蒜客NOIP模拟赛(3) D1T2 信息传递
一个数据包在一个无向网络中传递.在时刻0,该数据包将依照特定的概率随机抵达网络中的某个节点.网络可以看做一张完全带权无向图,包含N个节点,若t时刻数据包在节点i,则在t+1时刻,数据包被传递到节点j的 ...
- UOJ #146. 【NOIP2015】信息传递 连通分量 tarjan模板题
http://uoj.ac/problem/146 题解:强连通分量 tarjan模板题.同时试了一下codeblock #include<bits/stdc++.h> using nam ...
- 【NOIP2015】信息传递(强连通分量)
题意:找一张图中的最小环 O(n) 思路:强连通分量tarjan即可 注意环中节点数>1 ..]of longint; n,i,ans,tot,id,top,time,x:longint; pr ...
- $Noip2015/Luogu2661$ 信息传递 并查集
Luogu $Description$ 给定一个有向图,每个点只有一条出边.求图里的最小环. $Sol$ 使得这个题不难的地方就在于每个点只有一条出边叭. 一边连边一边更新答案.首先当然是初始$f[i ...
- [NOIP2015]信息传递
[NOIP2015]信息传递[问题描述]有
- codevs 4511 信息传递(NOIP2015 day1 T2)
4511 信息传递 NOIP2015 day1 T2 时间限制: 1 s 空间限制: 128000 KB 传送门 题目描述 Description 有个同学(编号为 1 到)正在玩一个信息传递的游戏. ...
- LOJ2421 NOIP2015 信息传递 【tarjan求最小环】
LOJ2421 NOIP2015 信息传递 LINK 题目大意就是给你一个有向图,求最小环 有一个很奇妙的性质叫做每个点只有一条出边 然后我们考虑对每个强联通分量进行考虑 发现每个强联通分量内的边数一 ...
- [NOIP2015] 提高组 洛谷P2661 信息传递
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...
- 【 NOIP2015 DAY1 T2 信息传递】带权并查集
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...
随机推荐
- NGINX: 反向代理 Nexus
Nginx 反向代理 nexus 的服务, 一直卡在 Initialize... 解决方式是添加一个 header X-Forwarded-Proto: proxy_set_header X-Forw ...
- lnmp、lamp、lnmpa一键安装包(Updated: 2016-4-12)
lnmp.lamp.lnmpa一键安装包(Updated: 2016-4-12) 文章目录 脚本特性 安装步骤 如何添加虚拟主机? 如何删除虚拟主机? 如何管理ftp账号? 数据备份 如何管理服务 ...
- hdu 1162 Eddy's picture(最小生成树算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162 Eddy's picture Time Limit: 2000/1000 MS (Java/Ot ...
- Python3 Socket和SocketServer 网络编程
socket只能实现同时一个服务和一个客户端实现交互,socketserver可以实现多个客户端同时和服务端交互 1.利用Socket编写简单的同一个端口容许多次会话的小案例: 服务端: #!/usr ...
- linux编程之信号量编程
信号量当我们在多用户系统,多进程系统,或是两者混合的系统中使用线程操作编写程序时,我们经常会发现我们有段临界代码,在此处我们需要保证一个进程(或是一个线程的执行)需要排他的访问一个资源.信号量有一个复 ...
- 浅谈linux的死锁检测 【转】
转自:http://www.blog.chinaunix.net/uid-25942458-id-3823545.html 死锁:就是多个进程(≥2)因为争夺资源而相互等待的一种现象,若无外力推动,将 ...
- perl多线程tcp端口扫描器(原创)
perl多线程tcp端口扫描器(原创) http://bbs.chinaunix.net/thread-1457744-1-1.html perl socket 客户端发送消息 http://blog ...
- 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6152 Friend-Graph 暴暴暴暴力
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6152 题意:判定一个无向图是否有三个点的团或者三个点的独立集. 解法:Ramsey theorem,n ...
- webview loadRequest
// 所构建的NSURLRequest具有一个依赖于缓存响应的特定策略,cachePolicy取得策略,timeoutInterval取得超时值 [self.yourSite loadRequest: ...
- JDBC数据源连接池(1)---DBCP
何为数据源呢?也就是数据的来源.我在前面的一篇文章<JDBC原生数据库连接>中,采用了mysql数据库,数据来源于mysql,那么mysql就是一种数据源.在实际工作中,除了mysql,往 ...