P2661 信息传递 二分图的最小环
题目描述
有 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解释

游戏的流程如图所示。当进行完第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 信息传递 二分图的最小环的更多相关文章
- P2661 信息传递
P2661 信息传递dfs求最小环,要加时间戳,记录这个点是哪一次被dfs到的.] #include<iostream> #include<cstdio> #include&l ...
- 洛谷P2661 信息传递(最小环,并查集)
洛谷P2661 信息传递 最小环求解采用并查集求最小环. 只适用于本题的情况.对于新加可以使得两个子树合并的边,总有其中一点为其中一棵子树的根. 复杂度 \(O(n)\) . #include< ...
- 2015 提高组 信息传递--tarjan找最小环
P2661 信息传递 题目描述 有 n 个同学(编号为 1 到 n )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti 的同学. ...
- 洛谷 P2661 信息传递 题解
P2661 信息传递 题目描述 有 \(n\) 个同学(编号为 \(1\) 到 \(n\) )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 \(i\) 的同学的信息传 ...
- P2661 信息传递 DFS
题目链接:洛谷 P2661 信息传递 一个人要想知道自己的生日,就意味着信息的传递是成环的,因为每轮信息只能传递一个人,传递的轮数就等于环的大小 环的大小就等于环中的两个点到第三个点的距离之和加一,我 ...
- 洛谷P2661 信息传递==coedevs4511 信息传递 NOIP2015 day1 T2
P2661 信息传递 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知 ...
- luogu P2661 信息传递 x
P2661 信息传递 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知 ...
- 洛谷 P2661 信息传递(并查集 & 最小环)
嗯... 题目链接:https://www.luogu.org/problemnew/show/P2661 这道题和一些比较水的并查集不太一样,这道题的思路就是用并查集来求最小环... 首先,如果我们 ...
- P2661 信息传递[最小环+边带权并查集]
题目来源:洛谷 题目描述 有 n 个同学(编号为 1 到 n )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti 的同学. 游戏 ...
随机推荐
- 前端 -----jQuery的位置信息
08-jQuery的位置信息 jQuery的位置信息跟JS的client系列.offset系列.scroll系列封装好的一些简便api. 一.宽度和高度 获取宽度 .width() 描述:为匹配的 ...
- Laravel 5.2 错误-----ReflectionException in compiled.php line 8572: Class App\Http\Controllers\Apih5\ZhaoshangController does not exist
测试的时候,报错了!想不到找了半天的问题,居然是个低级错误. <?php namespace App\Http\Controllers\Apih5; use Illuminate\Http\Re ...
- 【原创】大叔经验分享(30)CM开启kerberos
kerberos安装详见:https://www.cnblogs.com/barneywill/p/10394164.html 一 为CM创建用户 # kadmin.local -q "ad ...
- Day7--------------IP地址与子网划分
1.ip地址:32位 172.16.45.10/16 网络位:前十六位是网络位 主机位:后16位是主机位 网络地址:172.16.0.0 主机地址:172.16.45.10 A类: 0NNNNN ...
- spring中BeanFactory和FactoryBean的区别
共同点: 都是接口 区别: BeanFactory 以Factory结尾,表示它是一个工厂类,用于管理Bean的一个工厂 在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器 ...
- jquery中的attr与prop的区别,什么时候用attr,什么时候用prop
只要有 Boolean() 属性的,简单说就是具有true 和 false 两个属性的属性,如 checked, selected 或者 disabled 使用prop(),(其实这些都是表单类的), ...
- Confluence 6 修改日志文件的目标位置
在 log4j 中,一个输出被定义为 'appender'.希望修改 log 文件的目标,你需要停止 Confluence 然后修改设置 log4j.properties 日志配置文件的 'Logg ...
- Guideline 5.2.1 - Legal - Intellectual Property 解决方案
最近在上架公司公司项目的时候遇到这个问题什么5.2.1 然后去了解发现最近不少人都遇到了这个问题.先说一下 我上架的APP是一个医疗的APP然后说需要什么医疗资质,估计是账号的公司资质不够吧.后面和苹 ...
- OrCAD Capture CIS 16.6 修改原理图的页面大小
OrCAD Capture CIS 16.6 打开需要修改的原理图. 菜单:Options > Schematic Page Properties... 看图操作...
- Appium 九宫格 手势解锁
分析九宫格定位 整个九宫格是一个 view self.driver.find_element_by_id("com.elc:id/gesturepwd_create_lockview&q ...