NOIp 2015信息传递【tarjan/拓扑/并查集】
一道好的NOIp题目,在赛场上总能用许多算法A掉。比如这道和关押罪犯。
法一:tarjan在有向图中跑最小环
有人从别人口中得知自己信息,等效于出现了一个环。于是 这就变成了一个有向图tarjan强连通分量的板子题。
#include<cstdio>
#include<algorithm>
#include<stack>
#define maxn 200090 using namespace std; int n,y,tot,ans=,dfs_clock,scc_cnt,tong[maxn],dfn[maxn],low[maxn],head[maxn],scc[maxn];
stack<int>s;
struct node{
int to,next;
}edge[maxn]; void add(int x,int y)
{
edge[++tot].to=y;
edge[tot].next=head[x];
head[x]=tot;
} void dfs(int p)
{
dfn[p]=low[p]=++dfs_clock;
s.push(p);
for(int i=head[p];i;i=edge[i].next)
{
int y=edge[i].to;
if(!dfn[y])
{
dfs(y);
low[p]=min(low[p],low[y]);
}
else if(!scc[y]) low[p]=min(low[p],dfn[y]);
}
if(dfn[p]==low[p])
{
scc_cnt++;
while()
{
int x=s.top();
s.pop();
scc[x]=scc_cnt;
if(x==p) break;
}
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&y),add(i,y);
for(int i=;i<=n;i++)
{
if(!dfn[i]) dfs(i);
tong[scc[i]]++;
}
for(int i=;i<=scc_cnt;i++) if(tong[i]>&&tong[i]<ans) ans=tong[i];
printf("%d\n",ans);
return ;
}
法二:拓扑排序
图中可能会出现很多环,求最小的一个。我们跑一遍拓扑排序后,那些不曾入到队列中的点就是成环的点。于是我们可以边拓扑排序边标记最后找到那些在环上的点,从他们出发分别求出环的大小进行比较。
#include<cstdio>
#include<algorithm>
#include<queue> using namespace std; int n,x,ans=,cnt,tot;
int du[],head[],vis[],flag[];
struct node{
int to,next;
}edge[];
queue<int>q; void add(int x,int y)
{
edge[++tot].next=head[x];
edge[tot].to=y;
head[x]=tot;
} void topo()
{
for(int i=;i<=n;i++)
if(!du[i]) q.push(i),flag[i]=;
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(--du[v]==) q.push(v),flag[v]=;
}
}
} void dfs(int x)
{
vis[x]=,cnt++;
for(int i=head[x];i;i=edge[i].next)
{
int y=edge[i].to;
if(vis[y]) return ;
dfs(y);
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&x),add(i,x),du[x]++;
topo();
for(int i=;i<=n;i++)
if((!flag[i])&&(!vis[i]))
{
cnt=;
dfs(i);
ans=min(ans,cnt);
}
printf("%d",ans);
return ;
}
法三:并查集
https://anyway.blog.luogu.org/solution-p2661
NOIp 2015信息传递【tarjan/拓扑/并查集】的更多相关文章
- NOIP 2015 信息传递
kawayi 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的 ...
- 2015 NOIP day2 t2 信息传递 tarjan
信息传递 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.luogu.org/problem/show?pid=2661 Descrip ...
- 2015 提高组 信息传递--tarjan找最小环
P2661 信息传递 题目描述 有 n 个同学(编号为 1 到 n )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti 的同学. ...
- hdu 1811 Rank of Tetris (拓扑 & 并查集)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- codeforces #541 D. Gourmet choice(拓扑+并查集)
Mr. Apple, a gourmet, works as editor-in-chief of a gastronomic periodical. He travels around the wo ...
- 距离LCA离线算法Tarjan + dfs + 并查集
距离B - Distance in the Tree 还是普通的LCA但是要求的是两个节点之间的距离,学到了一些 一开始我想用带权并查集进行优化,但是LCA合并的过程晚于离线计算的过程,所以路径长度会 ...
- 近期公共祖先(LCA)——离线Tarjan算法+并查集优化
一. 离线Tarjan算法 LCA问题(lowest common ancestors):在一个有根树T中.两个节点和 e&sig=3136f1d5fcf75709d9ac882bd8cfe0 ...
- 【NOIP模拟_54测试】【并查集】【二进制】【搜索】【区间序列类】
第一题 Mushroom的序列 大意: 给一个序列,求一段连续最长区间满足:最多改变一个数,使得区间是严格的上升子序列. 解: 直接扫描一遍,记一个最长上升子序列编号.然后从每一个编号为1 的点来判断 ...
- noip模拟赛 动态仙人掌(并查集,贪心)
思路: 贪心+并查集 因为45‘,所以可以很方便的算出每个仙人掌的最晚起跳(左端点) 右端点自然也能出来 先按左端点排序 如果他右面的和他相交,就更新 用并查集维护这个更新的关系 更新的同时维护高就好 ...
随机推荐
- C#连接数据库 增删改查
- js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符
js中对arry数组的各种操作小结 最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊 ...
- openwrt gstreamer实例学习笔记(二.gstreamer 的 Element)
对程序员来说,GStreamer 中最重要的一个概念就是 GstElement 对象.该对象是构建一个媒体管道的基本块.所有上层(high-level)部件都源自GstElement对象.任何一个解码 ...
- MYSQL强制使用索引和禁止使用索引
mysql强制索引和禁止某个索引 1.mysql强制使用索引:force index(索引名或者主键PRI) 例如: select * from table force index(PRI) limi ...
- block-循环引用
在ARC机制下,app的内存管理由操作系统进行管理,不须要程序猿手动的管理内存,方便了开发.虽然,自己主动释放内存非常方便.可是并不是绝对安全,绝对不会产生内存泄露. 大部分导致iOS对象无法按预期释 ...
- python day-3 基本数据类型
1. 编码 1. 最早的计算机编码是ASCII. 美国人创建的. 包含了英文字母(大写字母, 小写字母). 数字, 标点等特殊字符!@#$% 128个码位 2**7 在此基础上加了一位 2**8 8位 ...
- FFT用到的各种素数
int MOD; inline int mul(int a, int b){ return (long long)a * b % MOD; } int power(int a, int b){ ; ) ...
- Thread Runnable 区别
[线程的并发与并行] 在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(co ...
- Java中的文件上传和下载
文件上传原理: 早期的文件上传机制: 在TCP/IP中.最早出现的文件上传机制是FTP.他是将文件由客户端发送到服务器的标准机制. jsp中的文件上传机制: 在jsp编程中不能使用FTP的方法来上传文 ...
- Spark SQL is a Spark module for structured data processing.
http://spark.apache.org/docs/latest/sql-programming-guide.html