hdu2876 Connections between cities(LCA倍增)
图不一定联通,所以用并查集找各个联通块的祖先分别建图,之后就和LCA的步骤差不多了
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
inline int read(){
int sum=0,x=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
x=0;
ch=getchar();
}
while(ch>='0'&&ch<='9')
sum=(sum<<1)+(sum<<3)+(ch^48),ch=getchar();
return x?sum:-sum;;
}
inline void write(int x){
if(x<0)
putchar('-'),x=-x;
if(x>9)
write(x/10);
putchar(x%10+'0');
}
const int M=1e4+4;
const int maxlog=14;
struct node{
int v,nextt,w;
}e[M<<2];
int head[M],deep[M],grand[M][maxlog],dis[M][maxlog],f[M],s,n,tot,root,sign;
void addedge(int u,int v,int w){
e[tot].v=v;
e[tot].w=w;
e[tot].nextt=head[u];
head[u]=tot++;
}
int find(int x){
return x==f[x]?x:f[x]=find(f[x]);
}
void dfs(int x){
for(int i=1;i<=s;i++){
grand[x][i]=grand[grand[x][i-1]][i-1];
dis[x][i]=dis[x][i-1]+dis[grand[x][i-1]][i-1];
if(!grand[x][i])
break;
}
for(int i=head[x];~i;i=e[i].nextt){
int v=e[i].v;
// cout<<"exit"<<endl;
if(v!=grand[x][0]){
grand[v][0]=x;
deep[v]=deep[x]+1;
dis[v][0]=e[i].w;
dfs(v);
}
}
}
void init(){
s=floor(log(n+0.0)/log(2.0));
deep[0]=-1;
dfs(root);
}
int LCA(int a,int b){
if(deep[a]>deep[b])
swap(a,b);
int ans=0;
for(int i=s;i>=0;i--)
if(deep[a]<deep[b]&&deep[a]<=deep[grand[b][i]])
ans+=dis[b][i],b=grand[b][i];
for(int i=s;i>=0;i--)
if(grand[a][i]!=grand[b][i])
ans+=dis[a][i],a=grand[a][i],ans+=dis[b][i],b=grand[b][i];
if(a!=b)
ans+=dis[a][0],ans+=dis[b][0];
return ans;
}
int main(){
int m,k;
while(~scanf("%d%d%d",&n,&m,&k)){
for(int i=0;i<=n;i++)
f[i]=i,head[i]=-1,deep[i]=0;
memset(grand,0,sizeof(grand));
memset(dis,0,sizeof(dis));
tot=0;
while(m--){
int x=read(),y=read(),w=read();
addedge(x,y,w);
addedge(y,x,w);
int p=find(x);
int q=find(y);
if(p!=q)
f[q]=p;
}
for(int i=1;i<=n;i++){
if(f[i]==i){
root=i;
init();
}
// cout<<"!!!"<<f[i]<<endl;
}
/* for(int i=1;i<=n;i++)
cout<<deep[i]<<" ";
cout<<endl;*/
while(k--){
int u=read(),v=read();
int x=find(u);
int y=find(v);
if(x==y){
write(LCA(u,v));
putchar('\n');
}
else
puts("Not connected");
}
}
return 0;
}
hdu2876 Connections between cities(LCA倍增)的更多相关文章
- hdu 2874 Connections between cities [LCA] (lca->rmq)
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- HDU 2874 Connections between cities(LCA Tarjan)
Connections between cities [题目链接]Connections between cities [题目类型]LCA Tarjan &题意: 输入一个森林,总节点不超过N ...
- hdu-2874 Connections between cities(lca+tarjan+并查集)
题目链接: Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/327 ...
- HDU 2874 Connections between cities (LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意是给你n个点,m条边(无向),q个询问.接下来m行,每行两个点一个边权,而且这个图不能有环路 ...
- Connections between cities LCA
Problem Description After World War X, a lot of cities have been seriously damaged, and we need to r ...
- [hdu2874]Connections between cities(LCA+并查集)
题意:n棵树,求任意两点的最短距离. 解题关键:并查集判断两点是否位于一棵树上,然后求最短距离即可.此题可以直接对全部区间直接进行st表,因为first数组会将连接的两点的区间表示出来. //#pra ...
- HDU 2874 Connections between cities(LCA)
题目链接 Connections between cities LCA的模板题啦. #include <bits/stdc++.h> using namespace std; #defin ...
- hdu 2874 Connections between cities 带权lca判是否联通
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- hdu 2874 Connections between cities(st&rmq LCA)
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
随机推荐
- 51nod 1346:递归
1346 递归 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 函数f(n,m) { 若n=1或m=1返回a[n][m]; 返回f(n-1,m)异或 ...
- C语言I作业博客07
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/9935 我在这个课程的目 ...
- php魔术常量,_CLASS_,_METHOD_,_FUNCTION_
_CLASS_: 返回当前类的类名 _METHOD_:返回当前类方法的方法名(并显示类的调用,类名::方法名) _FUNCTION_:返回当前函数的函数名 _FILE_:当前文件的绝对路径(包含_FI ...
- json,pickle,shelve序列化
import json a = [{"a":"b"}] jd = json.dumps(a) #序列化,就是对象通过内存能够存储和传输的过程 with open ...
- go语言使用
设置 package control 在 Preferences->Package Setting->Package Control->Settings - User 中加入 cha ...
- iris数据集预测
iris数据集预测(对比随机森林和逻辑回归算法) 随机森林 library(randomForest) #挑选响应变量 index <- subset(iris,Species != " ...
- Linux--Shell传递参数
参考:http://www.runoob.com/linux/linux-shell-passing-arguments.html
- Linux-让程序不能多次运行
1.因为守护进程是长时间运行而不退出的,因此./a.out执行一次就有一个进程,执行多次就有多个进程. 2.这样并不是我们想要的.我们的守护进程一般都是服务器,服务器程序只要运行一个就够了,多次同时运 ...
- OpenMP笔记(二)
原文:https://www.bearoom.xyz/2019/02/18/openmp2/ OpenMP是由三部分组成的:指令.库函数和环境变量. 一.指令 在C/C++中使用OpenMP需要用到的 ...
- 6.react 基础 - 关于 react 开发 的原则
1. 声明式开发 通过绑定元素 在数据变更时 对元素进行动态渲染 2. 可以与其他框架并存 不在React的绑定元素内, 可以使用其他框架 如 ( vue jQuery 等 ) 进行元素操作 3. 组 ...