当前位置: 首页 > news >正文

给定n个结点m条边的简单无向图,判断该图是否存在鱼形状的子图:有一个环,其中有一个结点有另外两条边,连向不在环内的两个结点。若有,输出子图的连边

题目

思路:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define fi first
#define se second
#define lson p << 1
#define rson p << 1 | 1
const int maxn = 1e6 + 5, inf = 1e18 * 3, maxm = 4e4 + 5, mod = 1e9 + 7;
int a[maxn], b[maxn];
int n, m;
string s;
bool vis[maxn];
vector<int> G[maxn];
int from, to;
vector<int> tmp, vec;
int deg[maxn];void dfs(int u, int p){if(u == to && p == from) return;if(vis[u]) return;vis[u] = 1;tmp.pb(u);if(u == to){vec = tmp;return;}for(auto v : G[u]){dfs(v, u);}tmp.pop_back();
}
void solve(){int res = 0;int k, x, q;cin >> n >> m;for(int i = 1; i <= n; i++){G[i].clear();deg[i] = 0;}for(int i = 1; i <= m; i++){int u, v;cin >> u >> v;G[u].pb(v);G[v].pb(u);deg[u]++;deg[v]++;}for(int u = 1; u <= n; u++){if(deg[u] < 4) continue;for(auto v : G[u]){for(int i = 1; i <= n; i++){vis[i] = 0;}from = u;to = v;vec.clear();tmp.clear();dfs(u, u);if(vec.empty()) continue;vector<int> extra;tmp.clear();for(auto x : G[u]){if(x == vec.back() || x == *(vec.begin() + 1)) continue;if(find(vec.begin(), vec.end(), x) == vec.end()){//不在环内extra.pb(x);if(extra.size() == 2) break;}else{tmp.pb(x);//在环内,且与u相连}}vector<int> vt;if(extra.size() < 2){for(auto x : vec){vt.pb(x);if(find(tmp.begin(), tmp.end(), x) != tmp.end()){//在tmp内break;}}extra.pb(vec.back());for(int i = vec.size() - 1; i >= 0; i--){int x = vec[i];if(find(tmp.begin(), tmp.end(), x) != tmp.end()){extra.pb(x);break;}}// extra.pb(vec.end() - 2) 不能这样写,因为这个结点不一定与u相连// extra.pb(tmp.back()); 不能这样写,因为tmp的顺序跟环的结点顺序不一致extra.resize(2);vec = vt;}cout << "Yes\n";cout << vec.size() + 2 << '\n';int m = vec.size();for(int i = 0; i < vec.size(); i++){cout << vec[i] << ' ' << vec[(i + 1) % m] << '\n';}cout << u << ' ' << extra[0] << '\n';cout << u << ' ' << extra[1] << '\n';return;}}cout << "No\n";
}signed main(){ios::sync_with_stdio(0);cin.tie(0);int T = 1;cin >> T;while (T--){solve();}return 0;
}

http://www.lryc.cn/news/301293.html

相关文章:

  • 深入理解lambda表达式
  • 删除 Windows 设备和驱动器中的 WPS网盘、百度网盘等快捷图标
  • 【深度学习:DICOM 注释工具】在 DICOM 注释工具中寻找的 7 个功能
  • Spring Boot与Kafka集成教程
  • 基于飞腾ARM+FPGA国产化计算模块联合解决方案
  • 关于DVWA靶场Could not connect to the database service的几种解决办法
  • 已解决ModuleNotFoundError: No module named ‘paddle‘异常的正确解决方法,亲测有效!!!
  • 并发编程之深入理解JVM并发三大特性
  • helm部署gitlab-runner问题解决
  • [嵌入式系统-28]:开源的虚拟机监视器和仿真器:QEMU(Quick EMUlator)与VirtualBox、VMware Workstation的比较
  • 计算机组成原理:存储系统【三】
  • 学习Android的第十三天
  • 【开源】SpringBoot框架开发学校热点新闻推送系统
  • 代码随想录刷题笔记 DAY 28 | 复原 IP 地址 No.93 | 子集 No.78 | 子集 II No.90
  • LeetCode LCR 085. 括号生成
  • django定时任务(django-crontab)
  • 【教3妹学编程-算法题】输入单词需要的最少按键次数 II
  • 突破编程_C++_高级教程(多线程编程实例)
  • 精读《Function Component 入门》
  • 类的构造方法
  • ChatGPT和LLM
  • 「优选算法刷题」:判定字符是否唯一
  • 详解自定义类型:枚举与联合体!
  • 第13章 网络 Page738~741 13.8.3 TCP/UDP简述
  • Tomcat要点总结
  • Ubuntu 20.04 安装RVM
  • Ps:污点修复画笔工具
  • JAVA面试题17
  • 数据备份和恢复
  • 核心篇 - 集成IS-IS配置实战