首页 > 其他分享 >P8655 [蓝桥杯 2017 国 B] 发现环 题解

P8655 [蓝桥杯 2017 国 B] 发现环 题解

时间:2023-05-06 22:13:56浏览次数:46  
标签:环上 int 题解 入度 蓝桥 2017 排序 拓补

题目概述

题目传送门

在一棵树中新增一条边,使得这个图产生一个环,求在环上的点。

思路:拓补排序

对于这道题显然不能生搬硬套拓补排序的模板。

这道题中的图是一个无向图,而拓补排序却是处理有向图的一种思想。

不难想到可以将无向图转化为有向图,即将对于每条无向边变换为双向建边,就好处理了。

在这种情况下,很显然当一个点的入度大于或等于 \(2\) 时,即有不止一条边连向这个点时,该点就在环上。

我们可以建一个布尔类型 \(vis\) 数组来标记这个点的入度是否等于 \(1\),那么这个点就不在环上,那么没有被标记的点就是我们要求的答案了。

Code

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1; 
int n;
int in[N];
vector<int>e[N];
bool vis[N];//标记入度是否为1,即该点是否在环上
void topo()//拓补排序
{
	queue<int>q;
	for(int i=1;i<=n;i++)
		if(in[i]==1)//标记入度为1的点
		{
			q.push(i);
			vis[i]=true;
		}
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=0;i<e[u].size();i++)
		{
			int v=e[u][i];
			in[v]--;
			if(in[v]==1)//标记入度为1的点
			{
				q.push(v);
				vis[v]=true;
			}
		}
	}
}
void print()//输出未标记的点
{
	for(int i=1;i<=n;i++)
		if(!vis[i])cout<<i<<' ';
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int u,v;
		cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);//双向建边
		in[u]++;
		in[v]++;//两点的入度都增加
	}
	topo();
	print();
	return 0;
}

标签:环上,int,题解,入度,蓝桥,2017,排序,拓补
From: https://www.cnblogs.com/FHenryh/p/solution-luogu-P8655.html

相关文章

  • ABC297F 题解
    容斥萌萌题给你一个\(H\timesW\)的棋盘,问在棋盘上随机撒\(k\)个点,能够围住这\(k\)个点的最小子矩形的期望面积考虑枚举子矩形可以直接转成计数问题转变为在\(n\timesm\)的矩形中撒\(k\)个点,有多少种方案使得四条边上均至少有一个点答案乘上矩形面积再除以所有撒点......
  • [每天例题]蓝桥杯 C语言 最小公倍数
    最小公倍数题目 思路分析方法一:建立两个for循环,第一个for循环求最小公倍数,第二个for循环进行1至n的排列方法二:/*最小公倍数n项可以计算前面的n-1项例如;1、2、3、4、5、6的最小公倍数=1、2、3、4、5的最小公倍数和6的最小公倍数我们定义一个贡献度:贡献度(ai)%贡献度(ai-1)==0......
  • Mac M系列芯片 vue前端node-sass兼容问题解决
    0、由于M系列芯片是arm架构,在使用brew安装node时都是arm的node,但是[email protected]版本中不支持arm架构的出现如下报错:Error:NodeSassdoesnotyetsupportyourcurrentenvironment:OSXUnsupportedarchitecture(arm64)withUnsupportedruntime(88)Formoreinfor......
  • LVJR2 赛后题解
    赛后补题请到洛谷比赛。A考虑分类讨论。显然当\(a=0,b=0\)时,答案等于\(0\)。当\(a=0\)或\(b=0\)时,直接将等于\(0\)的数乘以一个很大的数字,将不等于零的数除以一个很大的数字,答案为\(v\)。当\(a,b\)均不为\(0\)时,可以选择先将一个数字减到\(0\),或将一个数字除......
  • WEB|[HITCON 2017]SSRFme
    源码110.244.80.206<?phpif(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){$http_x_headers=explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);$_SERVER['REMOTE_ADDR']=$http_x_headers[0];}#获取......
  • [Luogu-P1007]题解(C++)
    PartIPreface原题目(Luogu)PartIISketch给定一个正整数\(L\),表示独木桥长度。给定一个正整数\(N\),表示桥上士兵的数量。给定\(N\)个整数,分别表示每个士兵的坐标。规定走到\(0\)坐标或\(L+1\)的位置为下桥,两个士兵相遇时不能走过去,他们会各自回头走。求出所有士......
  • 【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答(一)
     【前提简介】本文档主要总结HarmonyOS开发过程中可能遇到的一些问题解答,主要围绕HarmonyOS展开,包括但不限于不同API版本HarmonyOS开发、UI组件、DevEcoStudio、Gitee示例代码等,并将持续更新哦。 【官方FAQ】【FAQ】HarmonyOS应用及服务开发常见问题汇总(官方总结,持续更新):ht......
  • [AtCoder-AT_ABC108_B]题解(C++)
    PartIPreface原题目(Luogu)原题目(AtCoder)PartIISketchPartIIIAnalysis观察这道题,我们很容易想到,必须推导出\(x1,y1,x2,y2\)与\(x3,y3,x4,y4\)之间的关系。我们观察下图。可以发现:\(\begin{aligned}\begin{cases}x3=x2-(y2-y1)\\y3=y2+(x2-......
  • [CodeForces-143A]题解(C++)
    PartIPreface原题目(Luogu)原题目(CodeForces)PartIISketch设有一个\(2\times2\)的棋盘,上面可以填入\(1-9\)的数字。给出\(6\)个数字,为每行每列以及每个对角线上的数字之和,求相应的摆放方式,无解输出\(-1\)。PartIIIAnalysis观察此题数据规模,不难发现数据......
  • [CodeForces-1104A]题解(C++)
    PartIPreface原题目(Luogu)原题目(CodeForces)PartIISketch给定一个整数\(n\)。将\(n\)拆分成一个数列\(a_1,a_2,a_3,\dots,a_m\)。使得\(\sum\limits_{k=1}^{m}a_k=n\),每个\(a_i\in[0,9]\)且数列中不相同的数的数量尽量少。PartIIIAnalysis我们很容易......