Codeforces 455C Civilization(并查集+dfs)
来源:互联网 发布:甘肃扶贫大数据平台 编辑:程序博客网 时间:2024/05/18 18:53
题目链接:Codeforces 455C Civilization
题目大意:给定N,M和Q,N表示有N个城市,M条已经修好的路,修好的路是不能改变的,然后是Q次操作,操作分为两种,一种是查询城市x所在的联通集合中,最长的路为多长。二是连接两个联通集合,采用联通之后最长路最短的方案。
解题思路:因为一开时的图是不可以改变的,所以一开始用dfs处理出各个联通集合,并且记录住最大值,然后就是Q次操作,用并查集维护,注意因为联通的时候要采用最长路径最短的方案,所以s的转移方程变为s = max(s, (s+1)/2 + (s0+1)/2 + 1)
#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int maxn = 3 * 1e5 + 5;int N, M, Q, f[maxn], s[maxn];int root, ans, rec;vector<int> g[maxn];int getfar(int x) { return f[x] == x ? x : f[x] = getfar(f[x]);}void link (int u, int v) { int x = getfar(u); int y = getfar(v); if (x == y) return; if (s[x] < s[y]) swap(s[x], s[y]); f[y] = x; s[x] = max(s[x], (s[x] + 1) / 2 + (s[y] + 1) / 2 + 1);}void dfs (int u, int p, int d) { f[u] = root; if (d > ans) { ans = d; rec = u; } for (int i = 0; i < g[u].size(); i++) { if (g[u][i] != p) dfs(g[u][i], u, d+1); }}int main () { int type, u, v; scanf("%d%d%d", &N, &M, &Q); for (int i = 1; i <= N; i++) { f[i] = i; g[i].clear(); } for (int i = 0; i < M; i++) { scanf("%d%d", &u, &v); g[u].push_back(v); g[v].push_back(u); } for (int i = 1; i <= N; i++) { if (f[i] == i) { root = rec = i; ans = -1; dfs(i, 0, 0); ans = -1; dfs(rec, 0, 0); s[i] = ans; } } for (int i = 0; i < Q; i++) { scanf("%d", &type); if (type == 1) { scanf("%d", &u); v = getfar(u); printf("%d\n", s[v]); } else { scanf("%d%d", &u, &v); link(u, v); } } return 0;}
2 0
- Codeforces 455C Civilization(并查集+dfs)
- Codeforces 455C Civilization(并查集+dfs)
- codeforces 466C Civilization 并查集+dfs
- 【CodeForces】445C Civilization 并查集
- Codeforces 455C Civilization 树的直径+并查集
- 【树的直径+并查集】 codeforces 455C - Civilization
- Codeforces 455C Civilization(并查集+树形dp)
- CodeForces 455C Civilization(并查集+树直径)
- codeforces 455C C. Civilization(树形dp+树的直径+并查集)
- Codeforces 455C —— Civilization(并查集,树上最长链)
- codeforces 455C Civilization 树的最长链+并查集
- Codeforces 455C. Civilization (树的直径+并查集)
- 【打CF,学算法——四星级】CodeForces 455C Civilization (【详解】并查集+树的直径)
- codeforces 455C Civilization
- CodeForces 455C-Civilization
- CodeForces 455C Civilization
- Codeforces 455E Civilization【思维+树的直径+并查集】
- CodeForces445C Civilization 带权并查集
- 工作中遇见的架构
- 最长递增子序列
- MyEclipse中文乱码解决方法
- 数的划分
- 自动取款机流程模拟C语言的实现
- Codeforces 455C Civilization(并查集+dfs)
- Maven、Nexus、SVN、Hudson 以及团队异地开发那些事(1)
- Ubuntu中FireFox背景颜色设置
- poj 1220 NUMBER BASE CONVERSION
- eclipse安装和使用JD-Eclipse反编译插件
- 【索引】Codeforces Round #260 (Div. 1)
- 【R】Linux安装R语言包(Installing R packages on Linux)
- [水]ZOJ1402
- fails to pass the Accelerometer Test on CTS Verifier.