题目描述

有 nn 个同学(编号为 11 到 nn )正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为 ii 的同学的信息传递对象是编号为 T_iTi​ 的同学。

游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息, 但是每人只会把信息告诉一个人,即自己的信息传递对象)。当有人从别人口中得知自 己的生日时,游戏结束。请问该游戏一共可以进行几轮?

输入输出格式

输入格式:

共22行。

第11行包含1个正整数 nn ,表示 nn 个人。

第22行包含 nn 个用空格隔开的正整数 T_1,T_2,\cdots\cdots,T_nT1​,T2​,⋯⋯,Tn​ ,其中第 ii 个整数 T_iTi​ 表示编号为 ii 的同学的信息传递对象是编号为 T_iTi​ 的同学, T_i \leq nTi​≤n 且 T_i \neq iTi​≠i 。

输出格式:

11个整数,表示游戏一共可以进行多少轮。

输入输出样例

输入样例#1: 复制

5
2 4 2 3 1
输出样例#1: 复制

3

说明

样例1解释

游戏的流程如图所示。当进行完第33 轮游戏后, 44号玩家会听到 22 号玩家告诉他自己的生日,所以答案为 33。当然,第 33 轮游戏后,22号玩家、 33 号玩家都能从自己的消息来源得知自己的生日,同样符合游戏结束的条件。

对于 30\%30%的数据, n ≤ 200n≤200;

对于 60\%60%的数据, n ≤ 2500n≤2500;

对于100\%100%的数据, n ≤ 200000n≤200000。

拓扑排序可以求是否有环   但是我不会求最小环

dfs 200000肯定会超时

可以采用拓扑排序优化 +dfs

300ms蒟蒻代码:

#include<bits/stdc++.h>
using namespace std;
//input b y bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
#define inf 0x3f3f3f3f
//////////////////////////////////
#define N 200000+9
int in[N];
vector<int>edge[N];
int vis[N];
int minn;
void dfs(int x,int cnt,int flag)
{
vis[x]=;
int k=edge[x][];
vis[k]=;
if(k==flag)
{
minn=min(minn,cnt);
return ;
}
dfs(k,cnt+,flag);
} int main()
{
int n;
RI(n);
rep(i,,n)
{
int a,b;
RI(a);
in[a]++;
edge[i].push_back(a);
}
queue<int>q;
rep(i,,n)
if(!in[i])q.push(i);//后来还要取出来 所以这里cnt不用变
int cnt=;//计算入读为0的点
while(!q.empty())
{
int u=q.front();q.pop();
vis[u]=;//去掉不成环的点
cnt++;
if(edge[u].size())
rep(i,,edge[u].size()-)
{
int v=edge[u][i];
in[v]--;
if(in[v]==)q.push(v);
}
}
minn=inf; rep(i,,n)
if(!vis[i])
dfs(i,,i); cout<<minn; return ;
}

70ms

不要开队列!!!太慢了   只是借用拓扑排序的思想就够了

#include<bits/stdc++.h>
using namespace std;
//input b y bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
#define inf 0x3f3f3f3f
//////////////////////////////////
#define N 200000+9
int in[N];
int edge[N];
int vis[N];
int minn;
void dfs(int x,int cnt,int flag)
{
vis[x]=;
int k=edge[x];
if(k==flag)
{
minn=min(minn,cnt);
return ;
}
dfs(k,cnt+,flag);
}
void del(int x)
{
vis[x]=;
if( --in[edge[x]]== )
del(edge[x]);
}
int main()
{
int n;
RI(n);
rep(i,,n)
{
int a,b;
RI(a);
in[a]++;
edge[i]=a;
}
rep(i,,n)
if(!in[i]&&!vis[i])
del(i); minn=inf;
rep(i,,n)
if(!vis[i])
dfs(i,,i); cout<<minn;
return ;
}

并查集 70ms

和今天写的带权并查集

一个原理

#include<bits/stdc++.h>
using namespace std;
//input b y bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
#define inf 0x3f3f3f3f
//////////////////////////////////
#define N 200000+9
int f[N];
int dis[N];//维护距离头的距离
int minn;
int find1(int x)
{
if(x==f[x])return x;
int k=find1(f[x]);
dis[x]+=dis[f[x]];//这个只是回溯 传递 并不是改权值
return f[x]=k;
}
void union1(int a,int b)
{
int x=find1(a);
int y=find1(b);
if(x==y)
minn=min(minn,dis[a]+dis[b]+);
else
{
f[x]=y;
dis[a]=dis[b]+;//这里为改权值
}
}
int main()
{
int n;
RI(n);
rep(i,,n)
f[i]=i,dis[i]=;
minn=inf;
rep(i,,n)
{
int a;
RI(a);
union1(i,a);
}
cout<<minn;
}

P2661 信息传递 二分图的最小环的更多相关文章

  1. P2661 信息传递

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

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

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

  3. 2015 提高组 信息传递--tarjan找最小环

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

  4. 洛谷 P2661 信息传递 题解

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

  5. P2661 信息传递 DFS

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

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

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

  7. luogu P2661 信息传递 x

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

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

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

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

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

随机推荐

  1. Github+HEXO FATAL bad indentation of a mapping entry at line 84

    当配置玩_config.yml文件时,执行hexo g -d时出现错误如下: $ hexo g -d FATAL can not read a block mapping entry; a multi ...

  2. python-进程之间通信、多线程介绍

    一.进程之间通信 进程的任务有三种状态:运行,就绪,阻塞. 加锁可以让多个进程修改同一块数据时,同一时间只能由一个任务可以进行修改,即串行的修改.牺牲了速度,保证了数据安全. 虽然可以使用文件共享数据 ...

  3. python多线程中锁的概念

    1 2 3 4 5 6 7 8 mutex = threading.Lock() #锁的使用 #创建锁 mutex = threading.Lock() #锁定 mutex.acquire([time ...

  4. python时间日期格式化和反格式化

    strftime()和strptime()行为 date,datetime和time对象都支持一种 strftime(format)方法,以创建一个表示显式格式字符串控制下的时间的字符串.从广义上讲, ...

  5. 缺失dll的问题

    不小心运行一下什么程序就会出现缺失xxx.dll的问题,太烦了,遇到好多,一直没有记录.现在开始记录,以便日后查看~ 1. api-ms-win-crt-runtime-l1-1-0.dll 64位系 ...

  6. eclipse c++11 cmake gnuradio

    承接之前的脚本.修改一下这个脚本的代码就可以让eclipse使用C++11了 #!/bin/sh echo "creat_debug for sdk" echo "mkd ...

  7. LeetCode(107): 二叉树的层次遍历 II

    Easy! 题目描述: 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如:给定二叉树 [3,9,20,null,null,15,7], ...

  8. 部署MySQL5.7时的权限问题

    本周部署MySQL5.7的时候遇到这样的问题,在初始化的时候,总是失败,并且报错: 2019-01-09T09:47:13.957685Z 0 [ERROR] InnoDB: Operating sy ...

  9. add web server(nginx)

    #!/bin/bash # # Web Server Install Script # Last Updated 2012.09.24 # ##### modify by WanJie 2012.09 ...

  10. IDEA的debug操作