传送门

Luogu

解题思路

考虑最小生成树的几个性质:

  • 所有最小生成树中边权相等的边的条数相等
  • 在任意一颗最小生成树中,边权相等的边所联通的点集一定

那么我们考虑把边权相等的边单独拿出来考虑。

每次把并查集恢复到加边前的状态,然后再判断这些边加进去会不会形成环即可。

PS. 恢复并查集时,可以考虑求出每一条边在 \(\text{Kruskal}\) 的过程中,将要被加入时两端点所在联通块。

细节注意事项

  • 有点难实现,要有耐心

参考代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#define rg register
using namespace std;
template < typename T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while (!isdigit(c)) f |= (c == '-'), c = getchar();
while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
s = f ? -s : s;
} const int _ = 500010; int fa[_], siz[_]; inline void init(int n) { for (rg int i = 1; i <= n; ++i) fa[i] = i; } inline int findd(int x) { return fa[x] == x ? x : fa[x] = findd(fa[x]); } inline void merge(int x, int y) { fa[findd(x)] = findd(y); } int n, m, q;
struct edge{ int x, y, val, id, tx, ty; }g[_], e[_]; inline bool cmp(const edge& x, const edge& y) { return x.val < y.val; } inline bool Cmp(const edge& x, const edge& y) { return x.id < y.id; } int main() {
#ifndef ONLINE_JUDGE
freopen("in.in", "r", stdin);
#endif
read(n), read(m);
for (rg int i = 1; i <= m; ++i)
read(g[i].x), read(g[i].y), read(g[i].val), g[i].id = i;
init(n), sort(g + 1, g + m + 1, cmp);
for (rg int i = 1; i <= m; ) {
int j = i;
do {
g[j].tx = findd(g[j].x);
g[j].ty = findd(g[j].y);
++j;
} while (j <= m && g[j].val == g[i].val);
while (i < j) {
while (findd(g[i].x) == findd(g[i].y) && i < j) ++i;
if (i < j) merge(g[i].x, g[i].y);
}
}
init(n), sort(g + 1, g + m + 1, Cmp);
for (read(q); q--; ) {
int s; read(s);
for (rg int x, i = 1; i <= s; ++i)
read(x), e[i] = (edge) { g[x].tx, g[x].ty, g[x].val };
sort(e + 1, e + s + 1, cmp);
int flag = 1;
for (rg int i = 1; i <= s && flag; ) {
int j = i;
do {
if (findd(e[j].x) == findd(e[j].y)) { flag = 0; break; }
merge(e[j].x, e[j].y), ++j;
} while (j <= s && e[j].val == e[i].val);
while (i < j) fa[e[i].x] = e[i].x, fa[e[i].y] = e[i].y, ++i;
}
puts(flag ? "YES" : "NO");
}
return 0;
}

完结撒花 \(qwq\)

最新文章

  1. sql三维数据
  2. 初识Quartz(入门案例)+常用的Cron表达式
  3. 关于RequireJS与AngularJS的集成文档
  4. shiro 自动登录
  5. Ubuntu jsp平台使用JDBC来连接MySQL数据库
  6. ibatis中使用like模糊查询
  7. 实现手机扫描二维码页面登录,类似web微信-第三篇,手机客户端
  8. Docker与容器快速入门
  9. gpart 使用笔记
  10. ngrok本地反向代理
  11. gitflow workflow
  12. tcl/tk实例详解——修改目录下所有文件(使用一个字符串代替另外一个)
  13. Codeforces 715B &amp; 716D Complete The Graph 【最短路】 (Codeforces Round #372 (Div. 2))
  14. 《Programming WPF》翻译 第3章 1.什么是控件
  15. Spark Streaming中的操作函数分析
  16. 洛谷P1809 过河问题_NOI导刊2011提高(01)
  17. go https json
  18. (转)Spring常用注解
  19. 老项目迁移到 springboot 过程
  20. SQL group 分组查询

热门文章

  1. 【算法学习记录-排序题】【PAT A1012】The Best Rank
  2. util之Stack
  3. ASP.NET + MVC5 入门完整教程三 (上) ---第一个MVC项目
  4. 马路 树链剖分/线段树/最近公共祖先(LCA)
  5. golang中的net/rpc包
  6. 移动端CSS重置
  7. Spring Security技术栈开发企业级认证与授权(一)环境搭建
  8. [转] Go 的并发模式:Context
  9. Codeforces Round #598 (Div. 3) D. Binary String Minimizing
  10. knn 算法 k个相近邻居