首页 > 其他分享 >基环树

基环树

时间:2023-07-11 12:13:05浏览次数:41  
标签:pp int 基环树 MAXN nex du ptop

基环树

简单无向图有n个点n-1条边,那么它们会连成一条直线

n个点n条边,相对多一条边,有且仅有一个环

可以利用拓扑排序找这个环

例题:F - Well-defined Path Queries on a Namori

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 10,MAXM = 2e5 + 10;
int n,q;
struct edge{
	int v;
	edge* nex;
}ed[MAXM * 2];
edge* head[MAXN];
int ptop = 0;
void add(int u,int v)
{
	ed[ptop].v = v;
	ed[ptop].nex = head[u];
	head[u] = &ed[ptop];
	ptop++;
}
int du[MAXN];
bool unable[MAXN];
int co = 1;//颜色
int color[MAXN];
void tp()//拓扑排序,找环
{
	queue<int> qu;
	for(int i = 1;i <= n;i++)
		if(du[i] == 1)
			qu.push(i);
	while(!qu.empty())
	{
		int u = qu.front();qu.pop();
		unable[u] = 1;
		edge* p = head[u];
		while(p != NULL)
		{
			int v = p -> v;
			du[v]--;
			if(du[v] == 1)
				qu.push(v);
			p = p -> nex;
		}
	}
}
bool use[MAXN];
void dfs(int c,int p)//染色
{
	if(use[p] || !unable[p])
		return;
	use[p] = 1;
	color[p] = c;
	edge* pp = head[p];
	while(pp != NULL)
	{
		int v = pp -> v;
		dfs(c,v);
		pp = pp -> nex;
	}
}
int main()
{
	cin >> n;
	for(int i = 1;i <= n;i++)
	{
		int u,v;cin >> u >> v;
		du[u]++,du[v]++;
		add(u,v);
		add(v,u);
	}
	tp();
	for(int i = 1;i <= n;i++)
	{
		if(!unable[i])
		{
			color[i] = co;
			edge* p = head[i];
			while(p != NULL)
			{
				int v = p -> v;
				dfs(co,v);
				p = p -> nex;
			}
			co++;
		}
	}
	cin >> q;
	while(q--)
	{
		int u,v;cin >> u >> v;
		if(color[u] == color[v])
			cout << "Yes" << endl;
		else
			cout << "No" << endl;
	}
}

标签:pp,int,基环树,MAXN,nex,du,ptop
From: https://www.cnblogs.com/xxcdsg/p/17544285.html

相关文章

  • 「学习笔记」基环树
    众所周知,一棵有\(n\)个节点的树有\(n-1\)条边,树上没有环。据此,明显的,对于一个有\(n\)个结点\(n\)条边的无向连通图,必定是在一棵树上的任意两个节点之间连一条边构成的。我们把\(n\)个节点\(n\)条边的无向连通图,就称为基环树。基环树上存在环,因此基环树它不是树,而......
  • 基环树dp
    应用:遇到每一个点只会有一个方向作用到其他点,这样产生的图形就是一个基环树深林 通常解决方法:利用树形dp把除去环的值更新出来,然后在对这个环经行处理即可模板题:一共有 � 个岛,每个岛都有一条出边,且该图是无向图,因为桥是可以双向行走的。给定桥的长度,即两点之间的......
  • 神秘基环树
    给一棵带边权的基环树,每次选一条有\(\textbf{3}\)条边的链,获得这\(\textbf{3}\)条边的权值并删去它们(只删边,点保留),求能获得的最大价值。\(n\le10^5\)Sol先考虑树怎么做,容易发设\(f_{i,0/1/2}\)表示节点\(i\)往下挂了长为\(0/1/2\)的链时获得的最大价值,\(1\)和\(2\)......
  • 基环树
    一、基环树的概念:基环树,就是一个n个点n条边的连通图。简单来说,就是一个树加上了一条边形成了一个环。如果不联通,那么它就变成基环树森林。如图如果断开环上任意一条边,那么它就变为一个树,如果断掉整个环,那么就变成了一个基环树森林。二、内向树和外向树内向树:每个点有且......
  • 基环树
     1584:骑士每个骑士都有讨厌的对象,构成一个环,求最大值(能取的最大战斗力)#include<queue>#include<iostream>#include<algorithm>typedeflonglongLL;#defineINF1e9usingnamespacestd;constintmaxn=1e6+10;intn,head[maxn],w[maxn],idx;LLf[maxn][2],sum;......
  • U259394 Gmt丶FFF 的基环树 题解
    题目链接:传送门之所以评黑,是因为实在是太难调了。(又回调了)。对于有$40%$的数据,$n\le3000$,这部分我们可以暴力删边,然后暴力求直径即可。那么对于$100%$的数据:首先......
  • 基环树学习笔记
    基环树以下内容参考:https://www.cnblogs.com/fusiwei/p/13815549.html概念基环树也叫环套树,标准定义是一个有\(n\)个节点\(n\)条边的联通图,如果不是联通的,则称其是......
  • 基环树
    基环树知识点来自:基环树1.基环树众所周知树的性质,即对于一个有\(n\)个节点的树,必定保证有\(n−1\)条边(无向边)。反过来,对于一个由\(n−1\)条无向边组成的连通图,必......
  • Luogu P1453 城市环路(基环树DP)
    法一:dsu#include<bits/stdc++.h>usingll=longlong;usingnamespacestd;constintN=100010;structnode{intv,nxt;}e[N......
  • 基环树专题
    最近做了下题,作业题目有一道很有意思的题目[CF711D](https://codeforces.com/problemset/problem/711/D) 这道题问的是给出一个必存在至少一个环的图里面,每次操作可以......