http://acm.hdu.edu.cn/showproblem.php?pid=2874

题解:LCA

参考文章: https://blog.csdn.net/weixin_43272781/article/details/88797088

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
#define endl "\n"
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=100000+10;
const int M=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,p,l,r,u,v,c;
int ans,cnt,flag,temp,sum,num;
int pre[N];
bool vis[N];
int dep[N];
int dp[N][21];
int dist[N];
int que[N];
int first[N];
char str;
struct node{int v,w;
}x;
struct query{int e,id;
}y;
vector<node>G[N];
int find(int x){return pre[x]==x?x:pre[x]=find(pre[x]);}
void marge(int u,int v){int tu=find(u);int tv=find(v);if(tu!=tv){pre[tv]=tu;}
}
void dfs(int u,int deep){vis[u]=1;que[++num]=u;//num在此处相当于dfs_clockfirst[u]=num;//表示第一次走的编号dep[num]=deep;for(int i=0,j=G[u].size();i<j;i++){int v=G[u][i].v;int w=G[u][i].w;if(!vis[v]){dist[v]=dist[u]+w;dfs(v,deep+1);que[++num]=u;dep[num]=deep;}}
}
void ST(int n){for(int i=1;i<=n;i++){dp[i][0]=i;}for(int i=0;(1<<i)<n;i++){for(int j=1;j+(1<<i)<n;j++){int a=dp[j][i],b=dp[j+(1<<i)][i];dp[j][i+1]=dep[a]<dep[b]?a:b;}}
}
int RMQ(int l,int r){k=log2(r-l+1);int a=dp[l][k],b=dp[r-(1<<k)+1][k];return dep[a]<dep[b]?a:b;
}
int LCA(int u,int v){int x = first[u] , y = first[v];if(x > y) swap(x,y);int res = RMQ(x,y);return que[res];
}
void init(){for(int i=1;i<=n;i++){G[i].clear();pre[i]=i;}memset(vis,0,sizeof(vis));memset(dep,0,sizeof(dep));memset(dist,0,sizeof(dist));memset(dp,0,sizeof(dp));memset(que,0,sizeof(que));cnt=0,num=0;
}
int main()
{
#ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout);
#endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);//scanf("%d",&t);while(~scanf("%d%d%d",&n,&m,&c)){init();for(int i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&k);x.v=v;x.w=k;G[u].push_back(x);x.v=u;G[v].push_back(x);marge(u,v);}for(int i=1;i<=n;i++){if(pre[i]==i){dist[i]=0;dfs(i,1);}}ST(2*n-1);for(int i=1;i<=c;i++){scanf("%d%d",&u,&v);if(find(u)==find(v)){int lca=LCA(u,v);cout<<dist[u]+dist[v]-2*dist[lca]<<endl;}else{cout<<"Not connected"<<endl;}}}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif//cout << "Hello world!" << endl;return 0;
}

Connections between cities相关推荐

  1. HDU——2874 Connections between cities

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

  2. HDU - 2874 Connections between cities(并查集+LCA)

    题目链接:点击查看 题目大意:给出n个点代表城市,再给出m条边将其连接,每条边都有边权,题目保证给出的图无环,现在给出两个点,首先询问两个点是否互相连通,若可以连通,询问两点之间的距离 题目分析:判断 ...

  3. HDU 2874 Connections between cities(LCA离线算法实现)

    http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意: 求两个城市之间的距离. 思路: LCA题,注意原图可能不连通. 如果不了解离线算法的话,可以看我之 ...

  4. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

  5. 一系列图论问题[转]

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  6. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  7. LCA(倍增+Tarjan)和BFS、DFS以及Prim、Kruskal

    文章目录 LCA 倍增 并查集 题目背景 题目描述 输入格式 输出格式 输入输出样例 Tarjan算法 LCA和倍增 LCA和Tarjan 深度优先搜索 广搜BFS 最小生成树 普里姆算法(找点) 克 ...

  8. kk_想要学习的知识

    2018/4/27 计算几何 一.简介 计算几何属于ACM算法中比较冷门的分类,在省赛中只在前几年考察过,这两年还没有考过,而且和高精度计算一样,遇到题目主要靠套模板,因此对题意的理解至关重要,而且往 ...

  9. 图论练习题(存起来练)

    =============================以下是最小生成树+并查集======================================  [HDU]  1213 How Man ...

最新文章

  1. 稍等片刻 正在提取文件_三亚种子罐市场价,中药提取浓缩设备的价格
  2. oracle添加分区语句_按照子分区模板添加子分区
  3. mysql使用参数指定用户_mysql-用户账号及权限管理
  4. java实现 mysql导入_怎么用java实现mysql数据库的导入导出
  5. 回归的正则化模型:岭回归和Lasso回归(套索回归)
  6. c语言中printf输出,C语言中printf输出的总结
  7. 中国矿业大学计算机学院研究生奖学金,中国矿业大学计算机学院研究生学业奖学金评定细则2014版...
  8. Flutter 与 RN对比
  9. 律师登台痛批,BSA置身事外
  10. 【转】将HTML5封装成android应用APK 文件若干方法
  11. 聊聊我的 Pandas 学习经历及动手实践
  12. 第 16 章 string类和标准模板库
  13. IEEE帐号的创建和ORCid
  14. 【漫画科普】什么是POL?什么是全光?
  15. java学习第183天,javaWeb学习第42天,复习第19天;p240-245(08/16)-6h
  16. 用python整个活(3)——生日悖论:birthday paradox
  17. 内网通讯工具都有哪些?
  18. 记录一次nginx服务器签名证书过期的排查过程
  19. 微软(北京).NET俱乐部第十二次技术沙龙
  20. 字符串String简易习题

热门文章

  1. navicat使用查询向表中插入一行记录_SQL--每日一解------Bulk Insert 快速插入
  2. 如何更改计算机性能,如何修改注册表优化电脑性能 修改注册表优化电脑性能方法...
  3. java文本编辑器 运行_能编译运行java的简单文本编辑器
  4. wps中的相交_【研途技能贴】| WPS里的布尔运算
  5. python语言format用法_python基础_格式化输出(%用法和format用法)
  6. 为什么long类型的变量需要加L初始化
  7. mysql数据库5.7配置文件_MySQL 5.7配置文件参考
  8. java控制器接收请求参数_SpringMVC之接收请求参数和页面传参
  9. 化工热力学重修补考第三章重点内容
  10. 怎样在Linux系统中编译,Linux操作系统如何编译程序?