codeforces 455C Civilization
来源:互联网 发布:燕十八php教程百度云 编辑:程序博客网 时间:2024/05/24 06:49
题意:有N个点,起初有M条边,每条边长度为1,两点之间没有重边。这样构成了一个个连通块。
有两种操作。第一种是询问某个点所在连通块最长路径长度。
第二种是连接两个连通块(可能属于同一连通块,这时不用操作),使得连接后的连通块最长路径最小。
思路:先预处理每个连通块的最大长度,这可以用两个dfs来解决,并用了并查集维护。
关于合并,易推得合并后最小的最大长度l3 = max(l1 , l2 , (l1+1)/2 + (l2+1)/2 + 1);
代码:
#include <iostream>#include <algorithm>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <vector>#include <list>#include <map>#include <set>#include <deque>#include <queue>#include <stack>#include <bitset>#include <functional>#include <sstream>#include <iomanip>#include <cmath>#include <cstdlib>#include <ctime>typedef long long ll;//#pragma comment(linker, "/STACK:1024000000,1024000000") //手动扩栈#define INF 1e9#define maxn 310000#define maxm 100086+10#define mod 1000000007#define eps 1e-7#define PI acos(-1.0)#define rep(i,n) for(int i=0;i<n;i++)#define rep1(i,n) for(int i=1;i<=n;i++)#define scan(n) scanf("%d",&n)#define scanll(n) scanf("%I64d",&n)#define scan2(n,m) scanf("%d%d",&n,&m)#define scans(s) scanf("%s",s);#define SZ(x) (int)G[x].size()#define ini(a) memset(a,0,sizeof(a))#define out(n) printf("%d\n",n)using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1vector<int> G[maxn];int n,m,q;int fa[maxn];int findset(int x){ return fa[x] == x ? x : fa[x] = findset(fa[x]); }bool vis1[maxn],vis2[maxn];int len[maxn];int mxid;int mx;void dfs1(int u,int dep){vis1[u] = 1;if(dep > mx ) { mx = dep; mxid = u;}for(int i = 0;i < SZ(u); i++){int v = G[u][i];if(vis1[v]) continue;dfs1(v,dep + 1);}}void dfs2(int u,int dep){vis2[u] = 1;mx = max(mx,dep);for(int i = 0;i < (int)G[u].size(); i++){int v = G[u][i];if(vis2[v]) continue;dfs2(v,dep+1);}}int main(){#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);// freopen("out.txt","w",stdout);#endifwhile(~scanf("%d%d%d",&n,&m,&q)){rep1(i,n) G[i].clear();rep1(i,n) fa[i] = i;ini(vis1);ini(vis2);int a,b;rep(i,m){scan2(a,b);G[a].push_back(b);G[b].push_back(a);int aa = findset(a);int bb = findset(b);if(aa != bb) fa[aa] = bb;}rep1(i,n){int p = findset(i);if(!vis1[p]){mx = 0;dfs1(p, 0);mx = 0;dfs2(mxid,0);len[p] = mx;}}int ty;while(q--){scan(ty);if(ty == 1){scan(a);int p = findset(a);out(len[p]);}else{scan2(a,b);int p1 = findset(a);int p2 = findset(b);if(p1 == p2) continue;fa[p1] = p2;int t = max(len[p1],len[p2]);len[p2] = max(t,(len[p1]+1)/2 + (len[p2]+1)/2 + 1);}}}return 0;}
0 0
- codeforces 455C Civilization
- CodeForces 455C-Civilization
- CodeForces 455C Civilization
- 【CODEFORCES】 C. Civilization
- Codeforces 455C Civilization(并查集+dfs)
- Codeforces 455C Civilization 树的直径+并查集
- 【树的直径+并查集】 codeforces 455C - Civilization
- Codeforces 455C Civilization(并查集+dfs)
- Codeforces 455C Civilization(并查集+树形dp)
- CodeForces 455C Civilization(并查集+树直径)
- CF 455C--Civilization
- Civilization CodeForces
- 【CodeForces】445C Civilization 并查集
- codeforces 455C C. Civilization(树形dp+树的直径+并查集)
- Codeforces 455C —— Civilization(并查集,树上最长链)
- codeforces 455C Civilization 树的最长链+并查集
- Codeforces 455C. Civilization (树的直径+并查集)
- codeforces 466C Civilization 并查集+dfs
- nyoj16矩形嵌套(DAG上的动态规划)
- C#屏幕录像控件代码
- Coder Ratings+SPOJ+树状数组
- Android将文字复制到剪切板
- Delphi实现拍照控件的程序代码
- codeforces 455C Civilization
- yii上传图片、yii上传文件、yii控件activeFileField使用
- js学习基础
- 幸福的没关系的发挥媳妇没想法
- 小记—不定时补充
- Nginx反向代理+负载均衡+健康探测+缓存
- poj2777线段树
- [水]ZOJ1492
- python regexp