首页 > 其他分享 >基环树找环

基环树找环

时间:2024-05-29 16:11:03浏览次数:18  
标签:fa ll long 基环树 dfn getloop loop

abc167_d Teleporter

#include<bits/stdc++.h>
#define pt printf(">>>")
#define mid (((l)+(r))/2)
using namespace std;
typedef long long ll;
typedef long double ld;
const ll N=1e6+10,inf=1e18+10,mod=1e9+7;
vector<ll> G[N];
map<ll,bool> loop;
ll n,a[N],k;
ll f[N],dfn[N],tot;
void getloop(ll u,ll fa){
	dfn[u]=++tot,f[u]=fa;
	for(auto v:G[u]){
		if(v==fa)continue;
		if(dfn[v]>dfn[u]){
			loop[v]=true;
			while(v!=u)loop[v=f[v]]=true;
		}else if(!dfn[v])getloop(v,u);
	}
}
int main(){
	cin >> n >> k;
	for(ll i=1;i<=n;i++){
		cin >> a[i];
		G[a[i]].push_back(i);
		G[i].push_back(a[i]);
	}
	getloop(1,0);
	if(loop.size()==0)k=min(k,n);
	else if(k>n)k=n+(k-n)%(loop.size());
	ll now=1;
	for(ll i=1;i<=k;i++)now=a[now];
	cout << now;
	return 0;
}

标签:fa,ll,long,基环树,dfn,getloop,loop
From: https://www.cnblogs.com/alric/p/18220538

相关文章

  • 置换 & 基环树题
    T1Statement给一个长度为\(n(\le10^5)\)的排列\(\{a_i\}\)。求一个排列\(\{b_i\}\),使得\(a_i=b_{b_i}\),或输出不存在。Solution先把所有排列变成置换对于任意排列\(\{p_i\}\),它转成置换后都是\(i\top_i\),故有\(i\top_i\top_{p_i}\top_{p_{p_i}}\to...\)所以所有......
  • 基环树算法总结
    基环树算法总结一、什么是基环树基环树,顾名思义,有两个要素:环和树。因此,基环树就是一棵树的一个节点,扩成一个环,做题时,多棵基环树组成的基环树森林,常以如下方式出现:每个点只有一个出边。每个点只有一个入边。图中一共有\(n\)个点,\(n\)条边。那么,基环树类型的题目应该怎......
  • 基环树
    byDuck.感觉都是神秘乱搞。一般的处理方式:把整个环当成根。断环。CF711DDirectedRoads正难则反,考虑统计成环的数量。我们先把环搜出来,那么环上的边只能有全部顺时针或者全部逆时针两种方向,环外的边任意。设环长为\(L\),那么就有\(2^{n-L}\times2\)种有环的情况,从而......
  • 基环树小结
    基环树就是根节点基于环生长的一棵树,特点是\(n\)个节点\(n\)条边。如果\(n\)个节点\(n\)条边的图不联通那么是一个基环森林。很好证明,\(n\)个点\(n-1\)条边的联通图仅能是一棵树,现在从任一点引出一条边到任一点,由于两点先前一定联通,则在连接后原路径上的任意两点均有......
  • 关于基环树的一切
    观前须知笔者的博客主页声明本文使用CCBY-NC-SA4.0许可。本文为笔者在OI学习中的复习向学习笔记。部分内容会比较简略。如有好的习题会不断补充。知识简介定义基环树是一个有\(n\)个点\(n\)条边的连通图。因为树有\(n\)个点\(n-1\)条边。所以基环树可以......
  • 基环树
    1基环树概念1.1定义首先,基环树并不是一颗严格的树。它是一张由\(n\)个节点,\(n\)条边组成的图。1.2无向联通图上的基环树首先,一棵树有\(n\)个节点,\(n-1\)条边。那么基环树就可以看做是在一棵树上加了一条边,这样多出了一个环(因此基环树也被称作环套树)。如下图所示:1.......
  • 基环树学习笔记
    基环树学习笔记定义基环树指的是一张有\(n\)个节点和\(n\)条边的图,如果不保证连通的话,那么整张图是一张基环树森林。并且如果将环上的任意一条边去除,那么整棵基环树会成为一棵普通的树。分类基环树有以下几种特殊情况,也是题目中较多出现的。基环内向树指的是在一棵有向......
  • 基环树学习笔记
    1.定义基环树,又称环套树,n个点n条边,也就是一棵树多一条边,形成唯一的环,这是保证这n个点n条边构成的是一个连通图的时候才是唯一环,如果图不连通但是每个连通块点数都等于边数的时候这个图就是一个基环树森林,可以有多个环如果一张有向弱连通图每个点的入度都为1,则称它是一棵基环外......
  • 【图论】基环树 学习笔记
    基环树下面几个条件互相等价:一个图(连通块)是基环树联通块有n个点n条边图上存在且仅存在一个环,且环上每个节点是一颗子树的根。通常情况下树指的都是无向图,但是有向图也可以构成基环树。内向基环树:每个点都有一条出边。容易发现沿着这条边一定会走到环上“向内走”。外......
  • 基环树处理方法
    法一:环套树。把基环树看作一个环上吊了几棵树,在处理时遍历环上每个点,处理出每棵树的答案,然后做环形的操作。缺点:只能处理基环树,如果是仙人掌就不适用了。法二:树回边。以深搜树的方式看待,用处理树的方式(比如树形DP)。在遇到环上深度最浅的结点的时候,让它把下方的环的结果当作一......