题解 P5089 【[eJOI2018]元素周期表】

阅读: 评论:0

题解 P5089 【[eJOI2018]元素周期表】

题解 P5089 【[eJOI2018]元素周期表】

题目链接

Solution [eJOI2018]元素周期表

题目大意:如果一个矩形有三个角被标记,另外一个角也会被标记.求最小要手动标记多少个点才能让已经有一些标记的矩阵全被标记

分析:这题思路真的神仙

可以用一个常用套路,整个(n)行(m)列的矩阵看做一个二分图,显然我们的目标图就是一个完全二分图

再来看核聚变的式子,我们发现聚变后新添加的边任然在原来的联通分量里面,也就是说它不会改变联通分量的个数

问题就是:一个有了一些边的二分图,问最少添加多少条边可以让它变成完全二分图

显然答案等于连通分量个数(-1),可以用并查集维护

#include <cstdio>
#include <cctype>
using namespace std;
const int maxn = 5e5 + 100;
inline int read(){int x = 0;char c = getchar();while(!isdigit(c))c = getchar();while(isdigit(c))x = x * 10 + c - '0',c = getchar();return x;
}
struct union_set{int f[maxn],siz;inline void init(int n){siz = n;for(int i = 1;i <= n;i++)f[i] = i;}inline int find(int x){return (x == f[x]) ? x : (f[x] = find(f[x]));}inline void merge(int a,int b){int x = find(a),y = find(b);if(x != y){siz--;f[x] = y;}}
}s;
int n,m,q;
int main(){n = read(),m = read(),q = read();s.init(n + m);for(int x,y,i = 1;i <= q;i++)x = read(),y = read() + (x,y);printf("%dn",s.siz - 1);return 0;
}

转载于:.html

本文发布于:2024-01-31 06:49:28,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170665497126388.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:周期表   题解   元素
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23