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

类似 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. codeup之统计同成绩学生人数

    Description 读入N名学生的成绩,将获得某一给定分数的学生人数输出. Input 测试输入包含若干测试用例,每个测试用例的格式为 第1行:N 第2行:N名学生的成绩,相邻两数字用一个空格间隔 ...

  2. 面试官说又逮到一个不会用Git的

    这里这写简要,要看具体的步骤及解释清移步:https://www.bilibili.com/read/cv10510952 如果是自己创建仓库写代码上传(demo是自己仓库的自定义名字): git i ...

  3. 新纪元:"老"新人

    博客园注册很久了,但从未发布过内容.终于开通博客,记录自己,也支持博客园! 另外,这次苹果秋季发布会真的好无聊!︎

  4. 一个使用 WPF 开发的 Diagram 画板工具(包含流程图FlowChart,思维导图MindEditor)

    前言 今天大姚给大家分享一个使用 WPF 开发的 Diagram 画板工具(包含流程图FlowChart,思维导图MindEditor):AIStudio.Wpf.Diagram. 项目介绍 AISt ...

  5. 用脚手架创建odoo15项目

    Odoo 提供了一种机制来帮助建立一个新模块,odoo-bin有一个子命令脚手架来创建一个空模块 命令: $ odoo-bin scaffold <module name> <whe ...

  6. 能提高你的创作效率的超强AI工具:ChatMoney

    本文由 ChatMoney团队出品 引言 在广告创意行业,创新和高效是赢得市场的关键.而我今天要分享的就是如何利用ChatMoney这款强大的人工智能工具,打破创新难题,赚取丰厚收益. 让我告诉你一个 ...

  7. 鸿蒙HarmonyOS基础语法-循环-类型转化-事件

    变量命名规则 1,只能包含数字.字母.下划线.$,不能以数字开头(4种类型) 2,不能使用内置关键字或保留字(比如 let.const) 3,严格区分大小写 声明方式 变量字符串,数字,布尔(与TS一 ...

  8. 推荐五大AI+MCP自动化测试工具!

    在当今快速发展的软件行业,自动化测试已成为提升开发效率和产品质量的关键.今天,我们将给大家推荐五大MCP自动化测试工具,助你在自动化测试领域更进一步. 1.MCP介绍 首先,你得知道,MCP是什么? ...

  9. 五、Linux系统常用调试工具

    4.2.ps(查看进程状态) 用途:显示系统中运行的进程及其相关信息,如 PID(进程 ID).CPU 使用率.内存占用等. 常见用法: ps aux # 显示所有进程,包含用户.PID.CPU/内存 ...

  10. 西门子成都工厂的DevSecOps实践

    大家好,我是Edison. 4月15日,成都.NET线下技术沙龙活动中,我分享了一个主题<西门子成都工厂的DevSecOps实践>,向大家介绍了我们为什么要做DevSecOps 以及 我们 ...