当前位置: 首页 > news >正文

codeforces 455C 并查集

传送门

给n个点, 初始有m条边, q个操作。

每个操作有两种, 1是询问点x所在的连通块内的最长路径, 就是树的直径。 2是将x, y所在的两个连通块连接起来,并且要合并之后的树的直径最小,如果属于同一个连通块就忽视这个操作。

先dfs出每个连通块的初始直径, 然后合并的话就是len[x] = max( (len[x]+1)/2+(len[y]+1)/2+1, max(len[x], len[y]));  然后搞一搞就好了。

一开始写bfs写挫了一直超时,  只好改成dfs......

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define pb(x) push_back(x)
  4 #define ll long long
  5 #define mk(x, y) make_pair(x, y)
  6 #define lson l, m, rt<<1
  7 #define mem(a) memset(a, 0, sizeof(a))
  8 #define rson m+1, r, rt<<1|1
  9 #define mem1(a) memset(a, -1, sizeof(a))
 10 #define mem2(a) memset(a, 0x3f, sizeof(a))
 11 #define rep(i, a, n) for(int i = a; i<n; i++)
 12 #define ull unsigned long long
 13 typedef pair<int, int> pll;
 14 const double PI = acos(-1.0);
 15 const double eps = 1e-8;
 16 const int mod = 1e9+7;
 17 const int inf = 1061109567;
 18 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
 19 const int maxn = 3e5+5;
 20 int f[maxn], num[maxn], head[maxn*2], dis[maxn], cnt, q[maxn*2];
 21 struct node
 22 {
 23     int to, nextt;
 24 }e[maxn*2];
 25 void add(int u, int v) {
 26     e[cnt].to = v;
 27     e[cnt].nextt = head[u];
 28     head[u] = cnt++;
 29 }
 30 int findd(int u) {
 31     return f[u] == u?u:f[u] = findd(f[u]);
 32 }
 33 void unionn(int x, int y) {
 34     x = findd(x);
 35     y = findd(y);
 36     if(x == y)
 37         return ;
 38     f[y] = x;
 39     int now = (1+num[x])/2+(num[y]+1)/2+1;
 40     num[x] = max(now, max(num[x], num[y]));
 41 }
 42 int maxx = 0, pos = -1;
 43 int dfs(int u, int fa, int d) {
 44     if(d>maxx) {
 45         maxx = d;
 46         pos = u;
 47     }
 48     for(int i = head[u]; ~i; i = e[i].nextt) {
 49         int v = e[i].to;
 50         if(v == fa)
 51             continue;
 52         dfs(v, u, d+1);
 53     }
 54 }
 55 template<typename __ll>
 56 inline void read(__ll &m)
 57 {
 58     __ll x=0,f=1;char ch=getchar();
 59     while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();}
 60     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
 61     m=x*f;
 62 }
 63 int main()
 64 {
 65     int n, m, q, x, y;
 66     cin>>n>>m>>q;
 67     mem1(head);
 68     for(int i = 1; i<=n; i++) {
 69         f[i] = i;
 70         num[i] = 0;
 71     }
 72     while(m--) {
 73         read(x); read(y);
 74         add(x, y);
 75         add(y, x);
 76         x = findd(x); y = findd(y);
 77         f[x] = y;
 78     }
 79     for(int i = 1; i<=n; i++) {
 80         if(f[i] == i) {
 81             dfs(i, -1, 0);
 82             maxx = 0;
 83             if(pos == -1)
 84                 continue;
 85             dfs(pos, -1, 0);
 86             num[i] = maxx;
 87             maxx = 0;
 88             pos = -1;
 89         }
 90     }
 91     while(q--) {
 92         int sign;
 93         read(sign);
 94         if(sign == 1) {
 95             read(x);
 96             printf("%d\n", num[findd(x)]);
 97         } else {
 98             read(x); read(y);
 99             unionn(x, y);
100         }
101     }
102 }

 

转载于:https://www.cnblogs.com/yohaha/p/5013849.html

相关文章:

  • Android学习笔记之使用意图打开内置应用程序组件
  • java web sql注入测试(3)---现象分析
  • Android学习笔记之广播意图及广播接收者MyBroadcastReceiver、Broadcast
  • 一些简单的shell脚本实例 转
  • xUtils简介及其使用方法
  • OC基础(20)
  • Android框架Picasso介绍
  • Assets遇到的问题
  • 直接拿来用!最火的Android开源项目(一)
  • python --循环对象
  • Oracle中用触发器实现自动记录表数据被修改的历史信息
  • 直接拿来用!最火的Android开源项目(完结篇)
  • 睡前小dp-codeforce414B-dp+一点点想法
  • SlidingMenu-master中的example怎样导入eclipse运行
  • echarts.js
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【391天】每日项目总结系列128(2018.03.03)
  • CSS 专业技巧
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Just for fun——迅速写完快速排序
  • Laravel Mix运行时关于es2015报错解决方案
  • LeetCode算法系列_0891_子序列宽度之和
  • node入门
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • 简单实现一个textarea自适应高度
  • 面试总结JavaScript篇
  • 前端路由实现-history
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 协程
  • 用Canvas画一棵二叉树
  • - 转 Ext2.0 form使用实例
  • 《码出高效》学习笔记与书中错误记录
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • # C++之functional库用法整理
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #define
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (二)Linux——Linux常用指令
  • (二)windows配置JDK环境
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (三)模仿学习-Action数据的模仿
  • (十五)使用Nexus创建Maven私服
  • (小白学Java)Java简介和基本配置
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)【Hibernate总结系列】使用举例
  • (转)http协议
  • (转)setTimeout 和 setInterval 的区别
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • ..回顾17,展望18