图不一定联通,所以用并查集找各个联通块的祖先分别建图,之后就和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倍增)的更多相关文章

  1. hdu 2874 Connections between cities [LCA] (lca->rmq)

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  2. HDU 2874 Connections between cities(LCA Tarjan)

    Connections between cities [题目链接]Connections between cities [题目类型]LCA Tarjan &题意: 输入一个森林,总节点不超过N ...

  3. hdu-2874 Connections between cities(lca+tarjan+并查集)

    题目链接: Connections between cities Time Limit: 10000/5000 MS (Java/Others)     Memory Limit: 32768/327 ...

  4. HDU 2874 Connections between cities (LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意是给你n个点,m条边(无向),q个询问.接下来m行,每行两个点一个边权,而且这个图不能有环路 ...

  5. Connections between cities LCA

    Problem Description After World War X, a lot of cities have been seriously damaged, and we need to r ...

  6. [hdu2874]Connections between cities(LCA+并查集)

    题意:n棵树,求任意两点的最短距离. 解题关键:并查集判断两点是否位于一棵树上,然后求最短距离即可.此题可以直接对全部区间直接进行st表,因为first数组会将连接的两点的区间表示出来. //#pra ...

  7. HDU 2874 Connections between cities(LCA)

    题目链接 Connections between cities LCA的模板题啦. #include <bits/stdc++.h> using namespace std; #defin ...

  8. hdu 2874 Connections between cities 带权lca判是否联通

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  9. hdu 2874 Connections between cities(st&rmq LCA)

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

随机推荐

  1. python yield 使用示例

    1.yield由于创建迭代器 def deal(): tmp = [] for i in range(20): tmp.append(i) if i % 4 == 0: yield tmp tmp = ...

  2. Tensorflow——用openpose进行人体骨骼检测

    https://blog.csdn.net/eereere/article/details/80176007 参考资料code:https://github.com/ildoonet/tf-pose- ...

  3. FFmpeg命令大全(更新中)

    1.视频抽取音频: ffmpeg -i 3.mp4 -vn -y -acodec copy 3.aacffmpeg -i 3.mp4 -vn -y -acodec copy 3.m4a

  4. Mysql插入数据里有中文字符出现Incorrect string value的错误

    问题:Mysql插入数据里有中文字符出现Incorrect string value的错误   描述:CMD里直接敲代码插入数据   提示的部分截取为:ERROR 1366 (HY000): Inco ...

  5. css伪元素::before与::after使用基础示例

    1.指定文本前后添加内容 <div class="box">test</div> .box::before{ content: 'before'; marg ...

  6. java查看简单GC日志

    测试代码: public class GCtest { public static void main(String[] args) { for (int i = 0; i < 10000; i ...

  7. HDU 2444 The Accomodation of Students【二分图最大匹配问题】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2444 题意:首先判断所有的人可不可以分成互不认识的两部分.如果可以分成 ,则求两部分最多相互认识的对数. ...

  8. P3252 [JLOI2012]树

    题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度是0,它的儿子节点的深度为1.路径不 ...

  9. php抓取网站图片源码

    <?php /*完成网页内容捕获功能*/ function get_img_url($site_name){     $site_fd = fopen($site_name, "r&q ...

  10. VMware vSphere虚拟化-VMware ESXi 5.5组件添加本地磁盘--虚拟机扩容

    本地存储器可以是位于ESXi主机内部的内部硬盘,也可以是位于主机之外并直接通过SAS或者SATA等协议连接在主机上的外部存储系统.本地存储不需要存储网络即可与主机进行通信,只需要一根连接到存储单元的电 ...