原题链接:K-Link-Cut Tree_第46屆ICPC 東亞洲區域賽(澳門)(正式賽) (nowcoder.com)

题意:

要求一个边权值总和最小的环,并从小到大输出边权值(2的次幂);若不存在环,输出-1。

思路:

考虑按权值从小到大加边,当出现环时(利用并查集判环),这个环必定是总权值最小的环。

找到环后,不再加边,并从环上某一点做DFS,找到从该点出发并再次回到该点的环。

代码:

#include <bits/stdc++.h>
#define PII pair<int,int>
#define fi first
#define se second
using namespace std; const int N = 100010; int n, m, fa[N], stk[N], top;
vector<PII> v[N];
bool vis[N], mark; int find(int x)
{
return fa[x] == x ? x : fa[x] = find(fa[x]);
} void dfs(int u, int pre, int ed)
{
if(mark) return;
if(u == ed && ~pre) {
mark = true;
sort(stk + 1, stk + 1 + top);
for(int i = 1; i <= top; i++) printf("%d ", stk[i]);
cout << endl;
}
for(auto i : v[u]) {
if(vis[i.fi] || i.fi == pre) continue;
stk[++top] = i.se, vis[i.fi] = true;
dfs(i.fi, u, ed);
-- top, vis[i.fi] = false;
}
} void solve()
{
cin >> n >> m;
for(int i = 1; i <= n; i++) {
fa[i] = i, vis[i] = false;
v[i].clear();
}
int st = 0;
bool flag = false; // 是否存在环
for(int i = 1; i <= m; i++) {
int x, y;
scanf("%d%d", &x, &y);
if(flag) continue;
v[x].push_back({y, i}), v[y].push_back({x, i});
int fx = find(x), fy = find(y);
if(fx == fy) flag = true, st = x;
else fa[fx] = fy;
}
if(!flag) puts("-1");
else mark = false, dfs(st, -1, st);
} int main()
{
int test;
cin >> test;
while(test--) solve(); return 0;
}

最新文章

  1. 新版react踩坑总结
  2. (一)观察者模式-C++实现
  3. 论javascript中的原始值和对象
  4. (转)Array.prototype.slice.call自解
  5. [转]JDK6和JDK7中的substring()方法
  6. (转)HTML5 本地存储
  7. JDBC和JPA调用储存过程 接收存储过程有返回值
  8. Linux系统中,main函数的执行过程
  9. [Hapi.js] Managing State with Cookies
  10. UML简单梳理类图
  11. eclipse中debug快捷方式
  12. 屏蔽ps联网激活
  13. JS解析JSON字符串
  14. python使用正则解析网络地址的各个部分
  15. ES6新增对象方法的访问描述符:get(只读)、set(只写)
  16. WebView 安全之 addJavascriptInterface
  17. MJRefresh在Xode6中报错处理
  18. Python学习笔记【第十篇】:Python面向对象进阶
  19. excel 2007 无法输入中文
  20. 如何设置java环境变量

热门文章

  1. Intel CPU平台和架构介绍
  2. 文件传输协议:FTP、TFTP、SFTP有什么区别?
  3. 初始C语言作业一
  4. crontab和cron表达式详解
  5. MySQL体系结构与数据类型
  6. 一文详解 WebSocket 网络协议
  7. 开源LIMS系统miso LIMS(适用于NGS基因测序)
  8. C++从静态类型到单例模式
  9. 走进Linux的世界
  10. 5. `sklearn`下的线性回归