交通运输线(LCA)
题目大意:
战后有很多城市被严重破坏,我们需要重建城市。然而,有些建设材
料只能在某些地方产生。因此,我们必须通过城市交通,来运送这些
材料的城市。由于大部分道路已经在战争期间完全遭到破坏,可能有
两个城市之间没有道路。当然在运输线中,更不可能存在圈。
现在,你的任务来了。给你战后的道路情况,我们想知道,两个城市
之间是否存在道路,如果存在,输出这两个城市之间的最短路径长度
【输入】
第一行一个整数 Case(Case<=10)表示测试数据组数。
每组测试数据第一行三个整数 N,M 和 C(2<=N<=10,000)(0<=M<10,
000) (1<=c<=1000000)共有 N 个城市,现存 M 条边,共有 C 对运
输需求。
接下来 M 行,每行三个整数 A 和 B,D(1<=A,B<=N,A 不等于 B)表
示从 A 到 B 有一条直接的公路,且距离为 D。
最后 C 行,每行两个整数,S 和 T(1<=S,T<=N,S 不等于 T),即询问从 S
到 T 的最短路径长度。
【输出】
共 Case 行,否存在从 S 到 T 的路径,则输出最短路径,否则输出“Not
connected”
解题思路:lca稍微变形
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int N=1e4+; struct node1{
int to,len;
node1(int to,int len){
this->to=to;
this->len=len;
}
};
struct node2{
int to,id;
node2(int to,int id){
this->to=to;
this->id=id;
}
}; vector<node1>ve[N];
vector<node2>que[N];
bool vis[N];//记录是否在树上被访问
bool used[N];//记录节点是否在整张图中被访问
int fa[N];//记录父节点
int res[N];//查询结果
int dis[N];//dis[i]记录点i里根节点距离
int V,E; //初始化
void init(){
for(int i=;i<=V;i++){
fa[i]=i;
ve[i].clear();
que[i].clear();
}
memset(vis,false,sizeof(vis));
memset(res,-,sizeof(res));
} int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
} void Union(int a,int b){
int x=find(a),y=find(b);
if(x!=y){
fa[x]=y;
}
} void lca(int i){
vis[i]=true;
used[i]=true;
for(int j=;j<ve[i].size();j++){
node1 nd=ve[i][j];
//判断该点是否在图中未被访问过
if(!used[nd.to]){
dis[nd.to]=dis[i]+nd.len;
lca(nd.to);
Union(nd.to,i);
}
}
for(int j=;j<que[i].size();j++){
node2 nd=que[i][j];
//判断该点是否在树上被访问过
if(vis[nd.to]&&res[nd.id]==-){
if(nd.to==i)
res[nd.id]=;
else
res[nd.id]=dis[nd.to]+dis[i]-*dis[find(nd.to)];
}
}
} int main(){
int cas;
scanf("%d",&cas);
while(cas--){
int q;
scanf("%d%d%d",&V,&E,&q);
init();
for(int i=;i<=E;i++){
int a,b,d;
scanf("%d%d%d",&a,&b,&d);
ve[a].push_back(node1(b,d));
ve[b].push_back(node1(a,d));
}
for(int i=;i<=q;i++){
int x,y;
scanf("%d%d",&x,&y);
que[x].push_back(node2(y,i));
que[y].push_back(node2(x,i));
} //LCA
for(int i=;i<=V;i++){
if(!used[i]){
memset(vis,false,sizeof(vis));
lca(i);
}
}
//输出查询结果
for(int i=;i<=q;i++){
if(res[i]!=-)
printf("%d\n",res[i]);
else
printf("Not connected\n");
}
}
}
交通运输线(LCA)的更多相关文章
- 【bzoj3772】精神污染 STL+LCA+主席树
题目描述 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户 ...
- hdu 6115(LCA 暴力)
Factory Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total ...
- P5836 [USACO19DEC]Milk Visits S 从并查集到LCA(最近公共祖先) Tarjan算法 (初级)
为什么以它为例,因为这个最水,LCA唯一黄题. 首先做两道并查集的练习(估计已经忘光了).简单来说并查集就是认爸爸找爸爸的算法.先根据线索理认爸爸,然后查询阶段如果发现他们的爸爸相同,那就是联通一家的 ...
- hdu6115 Factory (LCA + 倍增)
Factory Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total ...
- BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 1280 MBSubmit: 3127 Solved: 795[Submit][Status][Discu ...
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
- [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...
- [bzoj2588][count on a tree] (主席树+lca)
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
- [板子]倍增LCA
倍增LCA板子,没有压行,可读性应该还可以.转载请随意. #include <cstdio> #include <cstring> #include <algorithm ...
随机推荐
- 【BZOJ3566】概率充电器(动态规划)
[BZOJ3566]概率充电器(动态规划) 题面 BZOJ Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: "采用全新纳米级加工 ...
- 《Linux内核设计与实现》第5章读书笔记
第五章 系统调用 一.系统调用概述 系统调用在Linux中称为syscall,返回的值是long型变量:如果出错,C库会将错误代码写入errno全局变量(通过调用perror()函数可以把该变量翻译成 ...
- SQL通用优化方案(where优化、索引优化、分页优化、事务优化、临时表优化)
SQL通用优化方案:1. 使用参数化查询:防止SQL注入,预编译SQL命令提高效率2. 去掉不必要的查询和搜索字段:其实在项目的实际应用中,很多查询条件是可有可无的,能从源头上避免的多余功能尽量砍掉, ...
- 解题:ZJOI 2014 力
题面 事实说明只会FFT板子是没有用的,还要把式子推成能用FFT/转化一下卷积的方式 虽然这个题不算难的多项式卷积 稍微化简一下可以发现实际是$q_i$和$\frac{1}{(i-j)^2}$在卷,然 ...
- 【bzoj2938】病毒
Portal -->bzoj2938 Solution 这题的话..一开始想的是不是上一个trie就消失了但是后来发现好像我还是太年轻qwq 比较容易联想到..AC自动机,多串匹配嘛 然后就.. ...
- 【生成树,堆】【CF1095F】 Make It Connected
Description 给定 \(n\) 个点,每个点有点权,连结两个点花费的代价为两点的点权和.另外有 \(m\) 条特殊边,参数为 \(x,y,z\).意为如果你选择这条边,就可以花费 \(z\) ...
- 解析C#彩色图像灰度化算法的实现代码详解
http://www.jb51.net/article/37067.htm public static Bitmap MakeGrayscale(Bitmap original) { ...
- [转载]js正则表达式语法
1. 正则表达式规则 1.1 普通字符 字母.数字.汉字.下划线.以及后边章节中没有特殊定义的标点符号,都是"普通字符".表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的 ...
- springboot读取自己定义的配置文件的方式以及使用joda_time来处理时间日期
总的来说呢,有两种方式,一种是原始的方式,即使用PropertiesUtils来读取配置文件. 第二种就是使用springboot的注解的方式来读取配置文件. 1.原始方式处理属性和时间日期: 工具类 ...
- python学习笔记(五) 200行实现2048小游戏
用前文提到的基础知识,和网上流行的2048源码,用python实现该游戏. 先将用户操作和游戏逻辑绑定. WASD分别对应移动方向上.左.下.右 然后实现矩阵的转置和逆置,这样只要实现一个方向的移动, ...