CodeForces1046B Hyperspace Highways
传送门
题意:
N个点,M条边,每一个环上的点两两有边相连。q次询问两点间最短距离。
题解:
构造圆方树,那么两点间距离感性认知一下就可以发现是树上两点间距离的一半。然后
dist(u,v)=(dep[u]+dep[v]-2*dep[lca])/2即可。
继续存板子。
代码:
#include<cstdio>
#include<algorithm>
#define maxn 200005
#define maxm 1400005
using namespace std;
int n,m,q,n1,a[maxn],head1[maxn],head2[maxn],ncnt,dfn[maxn],low[maxn],ccnt,stk[maxn],tp;
int siz[maxn],tid[maxn],rnk[maxn],fa[maxn],dep[maxn],son[maxn],top[maxn];
struct node { int v,nxt; } e[maxm];
void addedge(int head[],int u,int v)
{ncnt++;e[ncnt].v=v,e[ncnt].nxt=head[u];head[u]=ncnt;
}
void dfs(int u,int fa)
{dfn[u]=low[u]=++ccnt; stk[++tp]=u;for(int p=head1[u];p;p=e[p].nxt){int v=e[p].v;if(!dfn[v]){dfs(v,u); low[u]=min(low[u],low[v]);if(low[v]>=dfn[u]){addedge(head2,u,++n1); addedge(head2,n1,u);do { addedge(head2,stk[tp],n1); addedge(head2,n1,stk[tp]); } while(stk[tp--]!=v);}}else if(v!=fa) low[u]=min(low[u],dfn[v]);}
}
void dfs1(int u,int f)
{fa[u]=f,siz[u]=1,dep[u]=dep[f]+1;for(int p=head2[u];p;p=e[p].nxt){int v=e[p].v;if(v==f) continue;dfs1(v,u); siz[u]+=siz[v];if(siz[v]>siz[son[u]]) son[u]=v;}
}
void dfs2(int u,int tp)
{top[u]=tp,tid[u]=++ccnt,rnk[ccnt]=u;if(!son[u]) return;dfs2(son[u],tp);for(int p=head2[u];p;p=e[p].nxt){int v=e[p].v;if(v!=fa[u]&&v!=son[u]) dfs2(v,v);}
}
int lca(int u,int v)
{while(top[u]!=top[v])if(dep[top[u]]<dep[top[v]]) v=fa[top[v]];else u=fa[top[u]];return dep[u]<dep[v]?u:v;
}
int main()
{scanf("%d%d%d",&n,&m,&q); n1=n;for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);addedge(head1,u,v); addedge(head1,v,u);}dfs(1,0); ccnt=0;dfs1(1,0); dfs2(1,1);while(q--){int u,v;scanf("%d%d",&u,&v);int lc=lca(u,v);printf("%d\n",(dep[u]+dep[v])/2-dep[lc]);}
}
CodeForces1046B Hyperspace Highways相关推荐
- CF1045C Hyperspace Highways(圆方树板子)
CF1045C Hyperspace Highways 题目大意 给一张 n n n个点 m m m条边的图,保证若有一个环,一定是完全子图,多次询两个点之间的最短路径长度. 题解 如果会圆方树的可以 ...
- Codeforces 1045C Hyperspace Highways (看题解) 圆方树
学了一下圆方树, 好神奇的东西呀. #include<bits/stdc++.h> #define LL long long #define fi first #define se sec ...
- [CF1045C]Hyperspace Highways
题目大意:给一张$n$个点$m$条边的图,保证若有一个环,一定是完全子图,多次询问两个点之间的最短路径长度 题解:把完全子图缩成一个点,圆方树,方点权值设成$1$,圆点设成$0$即可. 卡点:数组开小 ...
- UVa 1393 (容斥原理、GCD) Highways
题意: 给出一个n行m列的点阵,求共有多少条非水平非竖直线至少经过其中两点. 分析: 首先说紫书上的思路,编程较简单且容易理解.由于对称性,所以只统计"\"这种线型的,最后乘2即是 ...
- POJ 2485 - Highways(求最小生成树的最大权值-Kruskal算法)
题目 Language:Default Highways Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 36414 Accept ...
- 【POJ 2485】 Highways
[POJ 2485] Highways 最小生成树模板 Prim #includeusing namespace std;int mp[501][501]; int dis[501]; bool vi ...
- POJ 2485 Highways(最小生成树 Prim)
Highways 大意:给你一个用邻接矩阵形式存储的有n个顶点的无向图,让你求它的最小生成树并求出在这个生成树里面最大的边的权值. 思路:用Prim求,判断条件改一下就行. PS:dis数组初始化 ...
- 【POJ - 2485 】Highways (最小生成树,Prim算法,瓶颈生成树)
题干: The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public highways. ...
- 【POJ - 1751】Highways (最小生成树)
题干: The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has a very poor system ...
最新文章
- 多线程处理缓慢_华为昇腾,AI推理性能超越对手一倍:软件挖掘处理器全部潜力...
- 516%增长:微博如何熬过七年之痒?
- mysql 远程登陆不上
- python的self
- MVC5 + EF6 + Bootstrap3
- 8个树莓派超级计算机_6 个可以尝试的树莓派教程
- 用C语言设置程序开机自启动
- 【编译原理】:NFA转变为DFA的子集构造法
- 各年龄段都是怎么提加薪的?
- 八个有价值的消费者心理
- Win10+Android+夜神安卓模拟器 搭建ReactNative开发环境
- Layui环境下form表单提交;jquery.form.js;lay-verify,lay-filter;
- 内含扩容源码的面试题,目标是手写HashMap!
- 技术文档 | 5G系统连接管理:CM空闲和CM已连接
- 分享一个简单易用的python并行模块【PP模块】
- c语言指数爆炸月球,指数爆炸:一张纸对折103次后,将填满整个宇宙?
- php生成本地word文件怎么打开,php生成word文件的简单范例
- PAT (Advanced Level) Practis 1039 Course List for Student (25)
- 景区夜游项目如何成功规划设计
- 信息时代的两极:重数量的百度,重质量的知乎
热门文章
- matlab 四舍五入、取整
- font:综合设置字体样式 (重点)
- 用golang写socks5代理服务器2-ssh远程代理
- Yii自定义加载配置文件
- 【BZOJ2006】【NOI2010】超级钢琴(堆)
- SSM+基于SSM的课堂考勤管理系统的设计与实现 毕业设计-附源码191617
- matlab 卷积神经网络工具,CNN卷积神经网络MATLAB工具箱中文注释版
- 中国食用菌市销售态势与竞争趋势预测报告(新版)2022-2027年
- android 广播 onreceive能干什么,Android BroadcastReceiver onReceive()在android 4.0上调用了两次...
- 最小的Linux系统制作过程详解