博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[bzoj3060][Poi2012]Tour de Byteotia_并查集
阅读量:5223 次
发布时间:2019-06-14

本文共 1436 字,大约阅读时间需要 4 分钟。

[Poi2012]Tour de Byteotia

题目链接


题解

这类题有一个套路,就是他不要求的点可以随便搞。

我们只需要保证前$k$个点是对的就行。

因此,如果一条边的有至少一个是关键点的端点,我们设当前边是关键边。

有结论:只删关键边一定是最优的。

然后枚举就行了。

代码

#include 
#define N 1000010 using namespace std;char *p1, *p2, buf[100000];#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )int rd() { int x = 0, f = 1; char c = nc(); while (c < 48) { if (c == '-') f = -1; c = nc(); } while (c > 47) { x = (((x << 2) + x) << 1) + (c ^ 48), c = nc(); } return x * f;}int fa[N];struct Node { int x, y;}e[N << 1];int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]);}int main() { int n = rd(), m = rd(), k = rd(); for (int i = 1; i <= n; i ++ ) { fa[i] = i; } for (int i = 1; i <= m; i ++ ) { e[i].x = rd(), e[i].y = rd(); if (e[i].x > k && e[i].y > k) { int x = find(e[i].x), y = find(e[i].y); if (x != y) { fa[x] = y; } } } int ans = 0; for (int i = 1; i <= m; i ++ ) { if (e[i].x <= k || e[i].y <= k) { int x = find(e[i].x), y = find(e[i].y); if (x != y) { fa[x] = y; } else { ans ++ ; } } } cout << ans << endl ; return 0;}

小结:由于题目把一些点设为了关键点,那么我们就把边分为带关键点的和不带关键点的就好。

转载于:https://www.cnblogs.com/ShuraK/p/11449008.html

你可能感兴趣的文章
mfc Edit控件属性
查看>>
[Linux]PHP-FPM与NGINX的两种通讯方式
查看>>
Java实现二分查找
查看>>
优秀员工一定要升职吗
查看>>
[LintCode] 462 Total Occurrence of Target
查看>>
springboot---redis缓存的使用
查看>>
架构图-模型
查看>>
sql常见面试题
查看>>
jQuery总结第一天
查看>>
Java -- Swing 组件使用
查看>>
Software--Architecture--DesignPattern IoC, Factory Method, Source Locator
查看>>
poj1936---subsequence(判断子串)
查看>>
黑马程序员_Java基础枚举类型
查看>>
[ python ] 练习作业 - 2
查看>>
一位90后程序员的自述:如何从年薪3w到30w!
查看>>
在.net core上使用Entity FramWork(Db first)
查看>>
System.Net.WebException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集...
查看>>
UIImage 和 iOS 图片压缩UIImage / UIImageVIew
查看>>
MongoDB的数据库、集合的基本操作
查看>>
ajax向后台传递数组
查看>>