首先介绍个概念:基环外向树,也叫环加外向树,环基树,章鱼图。

这就是一颗基环外向树

不难发现,若基环外向树有n个结点就有n条边,这也意味

着它不是颗普通的树,而是必定有一个自环。


再看看题目中的介绍:

通过注意里这句话可以知道每个点只有一个出度却可能有

多个入度。所以呢,它一定存在一个或多个自环(不然这

游戏永远无法结束)但也可能有普通的树(见图1的蓝点)

于是我们只需建图,这个图就是基环外向树,找出图中的

所有自环,或称之为环基树,然后算出所有

环基数中最小环的长度就是我们的答案。

具体怎么建图找环呢?请看代码。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int maxn=200000;
struct Edge
{
int to,ne;
} edge[maxn];
int num_edge=0,h[maxn];
int n;
int vis[maxn];
int ans=9999999;
int s;
bool flag=0;
int time=0;
template<class T>void read(T &x)
{
x=0;int f=0;char ch=getchar();
while(ch<'0'||ch>'9') {f|=(ch=='-');ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
x=f?-x:x;
return;
}
void add_edge(int f,int t)
{
edge[++num_edge].ne=h[f];
edge[num_edge].to=t;
h[f]=num_edge;
}
void loop(int x)
{
if(vis[x]==1)//找到环
{
vis[x]=3;
time=0;
s=x;
return;}
vis[x]=1; //标记为已走过但不是已知环上的一点
for(int i=h[x];i;i=edge[i].ne)
{ int son=edge[i].to;
if(vis[son]!=3)//儿子不在环上
{
loop(son); if(son==s&&time!=0)flag=1;
//如果环已经回溯完,这个time记录了环的长度
//即从一个相同的点绕一圈走到相同的点
if(!flag)time++,vis[x]=3;
//如果是在环上的点
if(flag)vis[x]=0;
//如果不在环上标记清零
return ;
}
vis[x]=0;//注意写这一步
return ;
}
}
int main()
{
int anss=999999999;
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
read(x);
add_edge(i,x);
}
for(int i=1;i<=n;i++)
{
//任取一点,沿着出边一直走,
//走到已经经过过了的点就找到了环
//time类似于时间戳,
//记录开始dfs的点绕一圈回溯走的步数即环长
if(vis[i]!=3)
{
s=0;
flag=0;
loop(i);
anss=min(anss,time);
}
}
cout<<anss<<endl;
return 0;
}

只跑了40ms,对比了一下其他人的应该是比较快的(无O2)

但是这道题一开始用了两遍dfs做,结果T了。

后面优化后又忘记加上注意的那一步只过了三个点,后面静态查错才找出来,以后做题一定要三思而后行啊

话说我这个提高组的在道普及-的题目上花了这么久(逃)

题解 P2661 【信息传递】的更多相关文章

  1. 洛谷 P2661 信息传递 题解

    P2661 信息传递 题目描述 有 \(n\) 个同学(编号为 \(1\) 到 \(n\) )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 \(i\) 的同学的信息传 ...

  2. 洛谷P2661 信息传递==coedevs4511 信息传递 NOIP2015 day1 T2

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

  3. P2661 信息传递

    P2661 信息传递dfs求最小环,要加时间戳,记录这个点是哪一次被dfs到的.] #include<iostream> #include<cstdio> #include&l ...

  4. P2661 信息传递 DFS

    题目链接:洛谷 P2661 信息传递 一个人要想知道自己的生日,就意味着信息的传递是成环的,因为每轮信息只能传递一个人,传递的轮数就等于环的大小 环的大小就等于环中的两个点到第三个点的距离之和加一,我 ...

  5. luogu P2661 信息传递 x

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

  6. 洛谷P2661 信息传递(最小环,并查集)

    洛谷P2661 信息传递 最小环求解采用并查集求最小环. 只适用于本题的情况.对于新加可以使得两个子树合并的边,总有其中一点为其中一棵子树的根. 复杂度 \(O(n)\) . #include< ...

  7. 【luogu P2661 信息传递】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2661#sub 一种利用并查集求最小环的做法: 对于每个同学看作一个点,每次信息传递是一条有向边,当出现最小环 ...

  8. 洛谷 P2661 信息传递(并查集 & 最小环)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P2661 这道题和一些比较水的并查集不太一样,这道题的思路就是用并查集来求最小环... 首先,如果我们 ...

  9. P2661 信息传递[最小环+边带权并查集]

    题目来源:洛谷 题目描述 有 n 个同学(编号为 1 到 n )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti​ 的同学. 游戏 ...

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

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

随机推荐

  1. 用Python写一个将Python2代码转换成Python3代码的批处理工具

    之前写过一篇如何在windows操作系统上给.py文件添加一个快速处理的右键功能的文章:<一键将Python2代码自动转化为Python3>,作用就是为了将Python2的文件升级转换成P ...

  2. mysql数据库引擎——MyISAM,InnoDB

    作为一个java web开发人员,对于mysql数据库掌握到具体比较这两类引擎的差异也蛮拼的,下面就介绍一下我在工作中积累的对这两类引擎的理解. MyISAM: 如果不更改mysql配置文件(my.i ...

  3. Android即时通讯开发之XMPP (一)初识XMPP协议和asmack

    在讲XMPP和asmck之前 ,我还是先分享一些资源文档,如果你有耐心,可以直接忽略我下面所写的.下面有关XMPP的介绍大部分是摘抄网上的文档,后面我会写一些基于XMPP协议和asmck开源库的聊天室 ...

  4. 使用python装饰器计算函数运行时间的实例

    使用python装饰器计算函数运行时间的实例 装饰器在python里面有很重要的作用, 如果能够熟练使用,将会大大的提高工作效率 今天就来见识一下 python 装饰器,到底是怎么工作的. 本文主要是 ...

  5. Delphi 字符串加密与解密函数

    EncdDecd 单元: EncodeString.DecodeString.EncodeBase64.DecodeBase64 uses EncdDecd; const str = '万一的 Del ...

  6. 数据库版本管理工具--Flyway的使用

    软件开发正常流程是:开发环境 ---> 测试环境  ----> 产环境 在开发过程中经常需要变更数据库: 表结构变更. 基础数据变更. 最直接的做法是:用客户端连上数据库直接修改. 依次修 ...

  7. 欢迎关注微信公众号codefans一起交流技术

  8. 【C/C++开发】【VS开发】win32位与x64位下各类型长度对比

    64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂):可以访问大型数据库.本文介绍的是64位下C语言开发程序注意事项. 1. 32 位和 64 ...

  9. 【算法集中营】CRC16 三种算法及c实现

    标准CRC生成多项式如下表: 名称       生成多项式             简记式*  标准引用    CRC-4       x4+x+1                  3        ...

  10. Kubernetes 相关镜像pull 不下来问题收集

    1. 可在相关的镜像前添加 keveon 或者 mirrorgooglecontainers 就可以下载镜像, 然后在修改 tag docker pull mirrorgooglecontainers ...