B. Fish Graph(dfs找环)

news2024/9/20 9:41:35

Problem - 1817B - Codeforces

给定一个具有n个节点和m条边的简单无向图。请注意,该图不一定是连通的。节点从1到n标记。

如果图包含具有特殊节点u的简单循环,则定义图为Fish Graph。除循环中的边之外,图应恰好有2条额外的边。两条边都应连接到节点u,但它们不应连接到循环的任何其他节点。

确定图是否包含子图,其中包含Fish图,并且如果是这样,请找到任何此类子图。

在本问题中,我们将子图定义为通过取原始图的任意边集获得的图像。

输入:

第一行输入整数t(1≤t≤1000),表示测试用例数量。接下来是测试用例的描述。

每个测试用例的第一行包含两个整数n和m(1≤n,m≤2000)——节点数和边数。

接下来的m行中的每一行都包含一条边的描述。每行包含两个整数ui和vi(1≤ui,vi≤n,ui≠vi)——一条边连接节点ui到节点vi。

保证没有两条边连接相同的无序节点对。

此外,保证所有测试用例的n总和和m总和均不超过2000。

输出:

对于每个测试用例,如果图包含子图,则输出“YES”,其为Fish图,否则打印“NO”。如果答案是“YES”,则在以下行中输出子图的说明。

说明的第一行包含一个整数k——子图的边数。

在接下来的k行中,输出所选子图的边缘。每个k行都应包含两个整数u和v(1≤u,v≤n,u≠v)——连接u和v的边属于子图。打印u和v的顺序无所谓,只要两个节点由原始图中的一条边连接即可。无论如何打印边缘的顺序都没有关系,只要结果子图是Fish Graph。

如果有多个解决方案,请打印任何一个。

示例:

Example

Input

Copy

 

3

7 8

1 2

2 3

3 4

4 1

4 5

4 6

4 2

6 7

7 7

6 7

1 2

2 3

3 4

4 1

1 3

3 5

4 4

1 3

3 4

4 1

1 2

Output

Copy

YES
6
5 4
6 4
4 3
1 4
2 1
3 2
YES
5
5 3
2 3
3 1
4 3
1 4
NO

 题解:
如果有这样的子图,其中一个点度数一定>= 4,一个环上的点外连两条枝干,即使这两条枝干也属于一个环,也没问题,因为我们找的是子图,只要拿特定的边即可

因此我们只需要搜索每个度数>=4的点,看他是否有环,有环就一定是

具体细节代码中都有注释

#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
 #define int long long
typedef pair<int,int> PII;
typedef unsigned long long ULL;
const int N = 4e5 + 10;
int mod = 1e9 + 7;
vector<int> p[N];
vector<int> ans;
int st[N];//看当前点是否走过
int vis[N];//标记目标节点相邻的节点
int dfs(int u,int f)
{
	if(st[u])
	return 0;
	ans.push_back(u);//存点
	st[u] = 1;
	if(vis[u]&&u != f)
	return 1;//如果碰到了,与目标节点相邻的节点,并且不是我们最开始的搜索起点,说明存在环
	for(auto ne:p[u])
	{
		if(dfs(ne,f))
		return 1;
	}
	ans.pop_back();//如果无环清空
	return 0;
}
void solve()
{
	int n,m;
	cin >> n >> m;
	for(int i = 1;i <= m;i++)
	{
		int x,y;
		cin >> x >> y;
		p[x].push_back(y);
		p[y].push_back(x);
	}
	int f = 0;
	ans.clear();
	for(int i = 1;i <= n;i++)
	{
		if(p[i].size() < 4)
		continue;
		for(int j = 1;j <= n;j++)
		{
			st[j] = 0;
			vis[j] = 0;
		}
		st[i] = 1;
		for(auto ne:p[i])
		{
			vis[ne] = 1;
		}
		for(auto ne:p[i])
		{
			if(dfs(ne,ne))
			{
				f = i;
				break;
			}
		}
		if(f)
		break;
	}
	if(f)
	{
		cout <<"YES\n";
		cout << ans.size() + 3 <<"\n";
		cout << f <<" "<<ans[0] <<"\n";
		cout << f <<" "<<ans[ans.size() - 1] <<"\n";
		for(int i = 0;i < ans.size() - 1;i++)
		cout << ans[i] <<" " << ans[i + 1] <<"\n";
		int c = 0;
		for(auto ne:p[f])
		{
			if(c == 2)
			break;
			if(ne != ans[0]&&ne != ans[ans.size() - 1])
			{
				cout <<f <<" " <<ne <<"\n";
				c++;
			}
		}
	}
	else
	{
		cout <<"NO\n";
	}
	
	for(int i = 1;i <= n;i++)
	{
		p[i].clear();
	}
}
signed main()
{
	ios::sync_with_stdio(0 );
	cin.tie(0);cout.tie(0);
	int t = 1;
	cin >> t;
	while(t--)
	{
		solve(); 
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/676134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式之外观模式笔记

设计模式之外观模式笔记 说明Facade(外观)目录外观模式示例类图电灯类电视机类空调类智能音箱外观类测试类 说明 记录下学习设计模式-外观模式的写法。JDK使用版本为1.8版本。 Facade(外观) 意图:为子系统中的一组接口提供一个一致的界面&#xff0c;Facade模式定义了一个高…

【2023,学点儿新Java-23】初步了解Java中的修饰符:static及其作用、native特性、final的理解

前情回顾&#xff1a; 【2023&#xff0c;学点儿新Java-22】Java中package的作用是什么 | Java中import的用法 | Java中的权限修饰符&#xff1a;private、protected、public【2023&#xff0c;学点儿新Java-21】Java中default的语法格式 | 父类私有的方法能被重写吗&#xff…

三分钟学习一个python小知识3-----------我的对python的列表和元组的理解

我的目录 1、python是什么2、列表的应用3. 元组的应用&#xff1a;4、深层次地进一步理解列表和元组4.1. 列表示例&#xff1a;4.2. 元组示例&#xff1a; 总结 1、python是什么 在Python中&#xff0c;列表和元组都是用于存储多个数据项的数据结构&#xff0c;但是它们有一些…

JavaWeb Tomcat

1.Web分类 静态web html这样的静态网页&#xff0c;只展示预先设定好的内容每个用户看到的内容是一样的不连接数据库&#xff0c;无法持久化数据&#xff08;比如注册&#xff09;动态web 动态展示内容每个用户看到的内容是不一样的&#xff0c;比如会有个性化推荐连接数据库&…

TienChin 项目改造完善项目结构分析

项目改造完善 更改 Banner Banner 生成网站&#xff1a;https://bootschool.net/ascii 更改启动类中的 Banner !> 如果不生效&#xff0c;需要重新编译一下项目工程(出现了启动之后还没改变就需要执行一下这个步骤)&#xff1a; 出现的原因是可能你没有删除 .idea 文件与 .i…

夜不收见证:夫妻从内江到成都,从真诚到真相

他们从四川内江的一条小巷&#xff0c;走进了成都的大街小巷。那里的房屋挨挨挤挤&#xff0c;像是在讲述他们曾经的梦想和勇气。他们是那些在内江的土地上种下了友情种子的少年&#xff0c;他们在成都的大地上&#xff0c;硕果累累。 他们从初中的课桌前走到了成人的世界里&am…

模拟电路系列文章-滤波器常识

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 滤波是一个动作&#xff0c;对不同频率输入信号&#xff0c;实施不同的增益和相移&#xff0c;以形成输出。滤波器&#xff0c;是执行这种动作的硬件设备或者软件程序。无论滤…

DJ4-7 SDN、OpenFlow

目录 一、SDN 1、SDN 的引入 2、SDN 体系结构的特征 3、SDN 控制器 4、SDN 通用转发 二、OpenFlow 一、SDN 1、SDN 的引入 软件定义网络 (Software Defined Network) SDN 源自美国斯坦福大学 Clean Slate 研究组提出的一种新型网络创新架构&#xff0c;可通过软件编程…

OCC-BEV:基于三维场景重建的多摄像机统一预训练

论文&#xff1a;https://arxiv.org/pdf/2305.18829.pdf 代码&#xff1a;https://github.com/chaytonmin/Occ-BEV 多摄像机3D感知技术&#xff08;能够收集车辆周围360的环境信息&#xff09;已经成为自动驾驶领域的一个突出研究领域&#xff0c;为 Lidarb-based 解决方案提供…

EMC学习笔记(九)特殊信号的EMC处理(一)

特殊信号的EMC处理&#xff08;一&#xff09; 1.电源接口EMC防护滤波电路1.1 24VDC电源口1.2 电源地的EMC电路1.3 Flyback EMC电路1.4 BUCK电路EMC电路1.5 推挽电路 2.时钟电路的EMC防护2.1 有源时钟2.2 无源时钟2.3 差分时钟 3.复位电路EMC防护4.对外接口信号的EMC防护4.1 差…

简历不要随意给猎头!他们会胡乱投递,影响你之后求职!

猎头是求职的重要途径之一&#xff0c;但猎头群体良莠不齐&#xff0c;并不是每个猎头都值得信任。 一位网友就对猎头持怀疑态度&#xff0c;问大家&#xff1a; 简历可以随意给猎头吗&#xff1f;给他们的时候需要注意什么&#xff1f;他们会不会群发&#xff0c;对自己之后求…

软考A计划-系统集成项目管理工程师-一般补充知识-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

F429驱动TFT裸屏时LTDC

F429驱动TFT裸屏时LTDC时序配置说明&#xff08;以V6的7寸驱动为例&#xff09; 说明&#xff1a; 1. 经常有兄弟问到这个问题&#xff0c;所有这里就写一个帖子。 2. 基础知识学习&#xff1a; TFT LCD的DE模式和HV模式的区别&#xff1a;http://bbs.armfly.com/read.php?tid…

Kafka搭建部署

解压文件 启动zookeeper 配置kafka环境变量 查看Kafka的版本内容 分发Kafka文件到slave1、slave2 修改server.properties文件 在Master、slave1和slave2节点上分别启动Kafka 在Master节点上执行如下命令来创建Topic 解压文件 tar -zxvf kafka_2.12-2.4.1.tgz -C /opt …

2022(一等奖)基于哨兵2影像的典型地表参量和红边指数的特征空间石漠化遥感监测模型

作品介绍 1 监测模型设计概述 &#xff08;1&#xff09;应用背景 石漠化是危害人们安全的自然灾害之一&#xff0c;也是土壤荒漠化其中的一种。我国西南地区是全球石漠化现象最严重的地区之一&#xff0c;长期的人为干预使得生态环境变得非常敏感&#xff0c;地表植被破坏严…

升级系统到Proxmox VE 8

Proxmox VE 8.0正式版发布 Proxmox VE 需要升级到7.4&#xff0c;验证一下。 rootpve99:~# pveversion pve-manager/7.4-13/46c37d9c (running kernel: 5.13.19-6-pve) rootpve99:~# pve7to8 CHECKING VERSION INFORMATION FOR PVE PACKAGES Checking for package updates.…

【实战与杂谈】本地搭建自己的游戏王卡片生成器

声明&#xff1a; 1.游戏王卡片制作器本身就是由【kooriookami】开发的&#xff0c;用于DIY卡片因此我只是原有功能再现并不会追加新功能 2.其次数据和卡图均来源于网络&#xff0c;因此我也只提供网络能获取该内容的途径&#xff0c;并不会预先准备好 最近一直没有时间看回复…

2023数字化产品经理如何建立自己的护城河线下演讲-上

来源&#xff1a;三爷出席《人人都是产品经理》2023数字化产品经理大会演讲实录 各位朋友们&#xff0c;大家下午好&#xff0c;非常高兴呢能受到人人都是产品经理官方的邀请&#xff0c;今天能有这样一个机会站在这里和大家做一个简单的分享。 ​ 编辑 添加图片注释&#xf…

C#/.Net的多播委托到底是啥?彻底剖析下

前言 委托在.Net里面被托管代码封装了之后&#xff0c;看起来似乎有些复杂。但是实际上委托即是函数指针&#xff0c;而多播委托&#xff0c;即是函数指针链。本篇来只涉及底层的逻辑&#xff0c;慎入。 概括 1.示例代码 public delegate void ABC(); //委托写在类的外面 publi…

Linux 多路转接 —— poll

目录 传统艺能&#x1f60e;poll&#x1f923;struct pollfd&#x1f923; poll 服务器&#x1f618;PollServer类&#x1f601;运行服务器&#x1f612;事件处理&#x1f601; 服务器测试&#x1f602; 传统艺能&#x1f60e; 小编是双非本科大二菜鸟不赘述&#xff0c;欢迎米…