环的权值为边权最小值,可以想到从大到小遍历权值,如果一条边加入后出现了环说明这条边的边权就是整个环的权值。

类似 Kruskal,我们把边权从大到小排序,然后用并查集维护连通情况,算出最小的权值。然后跑 dfs 找环输出方案。时间复杂度 \(\mathcal{O}(m\log{m} + n)\)。

#include <bits/stdc++.h>
using namespace std; const int N = 2e5 + 7; int read() {
char c = getchar();
int x = 0, p = 1;
while ((c < '0' || c > '9') && c != '-') c = getchar();
if (c == '-') p = -1, c = getchar();
while (c >= '0' && c <= '9')
x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return x * p;
} int n, m;
vector <int> to[N]; struct Edge {
int u, v, w;
bool operator < (const Edge p) const {
return w > p.w;
}
} t[N]; struct DSU {
int fa[N];
void init() {
for (int i = 1; i <= n; i ++) fa[i] = i;
}
int find(int x) {
return x == fa[x] ? x : (fa[x] = find(fa[x]));
}
void merge(int i, int j) {
int x = find(i), y = find(j);
fa[x] = y;
}
} D; bool vis[N];
stack <int> st;
bool flg; void dfs(int u, int p, int res) {
vis[u] = 1; st.push(u);
if (u == p) {
flg = 1; cout << res << ' ' << (int) st.size() << '\n';
while (!st.empty()) {
cout << st.top() << ' ';
st.pop();
}
cout << '\n';
return ;
}
for (int v : to[u]) {
if (!vis[v]) {
dfs(v, p, res);
if (flg) return ;
}
}
st.pop();
} void solve() {
n = read(), m = read();
for (int i = 1; i <= n; i ++)
to[i].clear();
for (int i = 1; i <= m; i ++)
t[i].u = read(), t[i].v = read(), t[i].w = read();
sort(t + 1, t + m + 1); D.init();
long long ans = 2e18; flg = 0;
for (int i = 1; i <= m; i ++) {
int u = t[i].u, v = t[i].v, w = t[i].w;
if (D.find(u) != D.find(v)) {
D.merge(u, v);
} else {
ans = i;
}
}
fill(vis + 1, vis + n + 1, 0);
for (int i = 1; i < ans; i ++) {
to[t[i].u].push_back(t[i].v);
to[t[i].v].push_back(t[i].u);
}
dfs(t[ans].u, t[ans].v, t[ans].w);
} signed main() {
int t = read();
while (t --) solve();
return 0;
}

随机推荐

  1. Vue3 学习-初识体验-helloworld

    在数据分析中有一个最重要的一环就是数据可视化, 数据报表的开发. 从我从业这几年的经历上看, 经历了从业务系统导表格数据, 到Excel+PPT, 再是开源报表工具, 再是主流商业BI产品(低/零代码 ...

  2. Plotting and visualization through matplotlib and pandas

    Plotting and visualization through matplotlib and pandas %matplotlib notebook import matplotlib.pypl ...

  3. AI生成应用:图片批量重命名工具 - 自动化整理您的图片库

    图片批量重命名工具 - 自动化整理您的图片库 GitHub项目地址: https://github.com/dependon/renameImage 项目介绍 这是一个基于Python开发的图形界面工 ...

  4. C++函数重载的一点问题

    问题 #include <iostream> #include <vector> enum A { Value = 1 }; void a(std::vector<int ...

  5. 敏捷史话(十):我牺牲了滑雪时间,参加了一场软件革命——Jon Kern

    "在镜头定格的一刹那,所有美好都和你不期而遇",这是 Jon Kern 对生活的表达.为了更好地记录生活,他在一家名为 flickr 的网站上创建了一个属于自己的照片博客,在这个博 ...

  6. python开发之路【第一章】:计算机基础结构

    1.1计算机基础 1.1.1 硬件 1944年,美籍匈牙利数学家冯·诺依曼提出计算机基本结构. 五大组成部分:运算器.控制器.存储器.输入设备.输出设备. -- 运算器:按照程序中的指令,对数据进行加 ...

  7. 在Linux下使用wxWidgets进行跨平台GUI开发(三)

    创建wxWidgets应用程序 在本文中,我们将了解创建wxWidgets应用程序所需的基础知识.首先创建一个简单的示例程序,展示如何显示图标:接着通过另一个示例演示事件的使用方法:最后探讨wxWid ...

  8. 袋鼠云春季发布会圆满落幕,构建Data+AI新质生产力

    4月10日,以"Data+AI,构建新质生产力"为主题的袋鼠云春季发布会圆满落幕.大会中,袋鼠云带来了一系列"+AI"的数字化产品与最新行业沉淀,旨在将数据与A ...

  9. Web前端入门第 71 问:JavaScript DOM 节点操作(增删改)常用方法

    有一个深有体会的事:发现现在很多前端同学,经常用 Vue 开发项目之后,在某些需求场景要操作 DOM 节点的时,就不知道咋办了~~ 以前接手过其他开发团队的项目,项目被漏洞扫描工具发现了异常,原因是用 ...

  10. 一、Linux常用命令(ubuntu/debian)

    1.rename(批量修改文件名) rename 's/屏幕录制 2024-09-06 123248_/aa_/' 屏幕录制\ 2024-09-06\ 123248_*.png 这条命令的含义是: s ...