题目链接:点击查看

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

题目分析:判断连通我们直接用并查集维护分块就好了,因为是无向图,所以最后对于每个分块随便选一个点当做根节点跑一遍dfs维护一下树上前缀和,最后就可以直接判断了,算是一个模板题吧,比较简单

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e4+100;unordered_map<string,int>mp;int n,m,q,limit;int fa[N];bool vis[N];struct Node
{int to,w;Node(int TO,int W){to=TO;w=W;}
};vector<Node>node[N];int du[N];int deep[N],dp[N][20];LL sum[N];void dfs(int u,int f,int dep)
{deep[u]=dep;dp[u][0]=f;for(int i=1;i<=limit;i++)dp[u][i]=dp[dp[u][i-1]][i-1];for(int i=0;i<node[u].size();i++){int v=node[u][i].to;int w=node[u][i].w;if(v==f)continue;sum[v]=sum[u]+w;dfs(v,u,dep+1);}
}int LCA(int x,int y)
{if(deep[x]<deep[y])swap(x,y);for(int i=limit;i>=0;i--)if(deep[x]-deep[y]>=(1<<i))x=dp[x][i];if(x==y)return x;for(int i=limit;i>=0;i--)if(dp[x][i]!=dp[y][i]){x=dp[x][i];y=dp[y][i];}return dp[x][0];
}int find(int x)
{return x==fa[x]?x:fa[x]=find(fa[x]);
}void merge(int x,int y)
{int xx=find(x);int yy=find(y);if(xx!=yy)fa[xx]=yy;
}void init()
{memset(du,0,sizeof(du));for(int i=1;i<=n;i++){node[i].clear();fa[i]=i;vis[i]=false;sum[i]=0;}limit=log2(n)+1;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);while(scanf("%d%d%d",&n,&m,&q)!=EOF){init();while(m--){int u,v,w;scanf("%d%d%d",&u,&v,&w);node[u].push_back(Node(v,w));node[v].push_back(Node(u,w));merge(u,v);}for(int i=1;i<=n;i++){int pos=find(i);if(vis[pos])continue;vis[pos]=true;dfs(pos,0,0);}while(q--){int a,b;scanf("%d%d",&a,&b);int aa=find(a);int bb=find(b);if(aa!=bb)printf("Not connected\n");else{int lca=LCA(a,b);printf("%lld\n",sum[a]+sum[b]-2*sum[lca]);}}}return 0;
}

HDU - 2874 Connections between cities(并查集+LCA)相关推荐

  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离线算法实现)

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

  3. 1013 Battle Over Cities(并查集解法)

    关于背景的介绍见1013 Battle Over Cities(图的DFS解法) DFS就是不算特定结点后数连通子图的总数,再减一.我想着那么并查集就是数不算特定节点后,集合元素(根)的个数.但是我弄 ...

  4. How Many Answers Are Wrong HDU - 3038(带权并查集经典题,满满的都是注释)

    How Many Answers Are Wrong HDU - 3038  点击打开链接 题意:现在有n个数(你并不知道这n个数是什么),m次查询,每次查询给出u,v,w.表示从第u个数到第v个数的 ...

  5. hdu 1232 畅通工程 最小生成树 并查集

    1232的连接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 #include <iostream>#include <cstdio& ...

  6. HDU 1213 How Many Tables 并查集 水~

    http://acm.hdu.edu.cn/showproblem.php?pid=1213 果然是需要我陪跑T T,禽兽工作人员还不让,哼,但还是陪跑了~ 啊,还有呀,明天校运会终于不用去了~耶耶耶 ...

  7. hdu 3234 Exclusive-OR 题解(并查集,思维)

    该死的期末复习终于结束了... 暑假来了\color{#ff0000}{暑假来了}暑假来了!!! 所以我就珂以非常开心的写博客了. 原题链接: hdu 题意简述 多组数据.你有一个没有确定的数列.有一 ...

  8. HDU 1272 小希的迷宫 (并查集)

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  9. hdu 1811 Rank of Tetris (并查集+拓扑排序)

    Problem - 1811 感觉这题的并查集以及拓扑排序并不难,但是做题的时候必须理解到矛盾(CONFLICT)与不确定(UNCERTAIN)直接的优先关系. 做这题的时候,构图什么的很简单,就是没 ...

最新文章

  1. Mybatis 3.5.X 解析LocalDateTime 错误问题
  2. MATLAB 画图时插入图例
  3. fourinone学习笔记一(上手demo)
  4. 网站推广收录少?网站推广专员浅析可能是蜘蛛抓取出现问题
  5. C语言 数组传递与值传递讲解
  6. Kotlin中的高阶函数
  7. 什么是Flink?Flink能用来做什么?
  8. MFC 最详细入门教程
  9. [机器学习] 混淆矩阵和kappa系数
  10. Android学习之适配器SimpleCursorAdapter
  11. java怎么把程序写入持久化_如何将DataFrame持久化到Hive表?
  12. 青龙羊毛---小龙传奇
  13. 国内打开Cousera方法
  14. 如何用python爬取e-hentai的图片
  15. 神经网络基础05-注意力机制
  16. oracle用sys用户导入dmp命令,Oracle导入dmp文件步骤
  17. libnet编译linux,redhart linux下如何安装libnet
  18. 小甲鱼Python笔记
  19. PSD-BPA南网培训资料
  20. 数据结构第二版(朱昌杰版)习题四答案

热门文章

  1. 工程和模块的关系以及继承和依赖的概念
  2. es6语法-对象拓展运算符
  3. 类的加载过程三:Initialization
  4. Request_获取请求参数通用方式介绍
  5. 字符串的构造方法和直接创建
  6. 全局变量-global关键字修改全局变量
  7. 单例设计模式-饿汉式
  8. java 阻塞 wait_java交替打印奇偶数问题,会出现2个线程都wait阻塞了
  9. java cmd找不到文件_cmd中输入java找不到文件解决方法
  10. multiprocessing.manager管理的对象需要加锁吗_iOS内存管理布局-理论篇