我是靠谱客的博主 跳跃老师,最近开发中收集的这篇文章主要介绍基环树找环-模板,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 1000010
#define MAXM 5010
inline int read()
{
int x = 0,ff = 1;char ch = getchar();
while(!isdigit(ch))
{
if(ch == '-') ff = -1;
ch = getchar();
}
while(isdigit(ch))
{
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * ff;
}
inline void write(int x)
{
if(x < 0) putchar('-'),x = -x;
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
}
int a,ti = 0,cnt = 0,fa[MAXN],vis[MAXN],loop[MAXN];
int lin[MAXN],tot = 0;
struct edge
{
int y,v,next;
}e[MAXN];
inline void add(int xx,int yy,int vv)
{
e[++tot].y = yy;
e[tot].v = vv;
e[tot].next = lin[xx];
lin[xx] = tot;
}
void get_loop(int x)
{
vis[x] = ++ti;
for(int i = lin[x],y;i;i = e[i].next)
{
if((y = e[i].y) == fa[x]) continue;
if(vis[y])
{
if(vis[y] < vis[x]) continue;
loop[++cnt] = y;
for(y = fa[y];y != fa[x];y = fa[y])
loop[++cnt] = y;
}
else fa[y] = x,get_loop(y);
}
}
int main()
{
a = read();
for(int i = 1;i <= a;++i)
{
int y,v;
y = read(); v = read();
add(i,y,v);
add(y,i,v);
}
get_loop(1);
for(int i = 1;i <= cnt;++i)
write(loop[i]),putchar(' ');
return 0;
}

 

转载于:https://www.cnblogs.com/AK-ls/p/10371320.html

最后

以上就是跳跃老师为你收集整理的基环树找环-模板的全部内容,希望文章能够帮你解决基环树找环-模板所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部