交通运输线(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 ...
随机推荐
- Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)
A 每次可以换一个或不换,暴力枚举位置即可 B 模拟 C 二分答案.. 边界可以优化r=totb/(tota-p),二分可以直接(r-l>=EPS,EPS不要太小,合适就好),也可以直接限定二分 ...
- Last Position of Target
For a given sorted array (ascending order) and a target number, find the first index of this number ...
- 聊一聊PHP的依赖注入(DI) 和 控制反转(IoC)
简介 IoC Inversion of Control 控制反转DI Dependency Injection 依赖注入 依赖注入和控制反转说的实际上是同一种东西,它们是一种设计模式,这种设计模式用来 ...
- Canny边缘检测算法原理及其VC实现详解(二)
转自:http://blog.csdn.net/likezhaobin/article/details/6892629 3. Canny算法的实现流程 由于本文主要目的在于学习和实现算法,而对于图像 ...
- Ubuntu下Sublime Text 2优化配置
以前经常用Notepad++,最近因为需要长期在Linux环境下进行C开发,就使用了sublime Text 2,这里就不介绍基本的了主要针对我使用的经验中进行一些总结. 1.pacage contr ...
- jetbrains phpstorm插件开发环境搭建
2018.04.14 重要更新: 使用 gradle 进行构建可以免去下面大部分步骤,使用 gradle 我们仅需下载安装 JDK.Idea. 使用 gradle 的方法是,新建 Project,然后 ...
- python基础之列表、字典、元祖等 (二)
一.作用域 if 1==1: name = 'weibinf' print name 下面的结论对吗? 外层变量,可以被内层变量使用 内层变量,无法被外层变量使用 二.三元运算 result = 值1 ...
- 「Linux」VMware安装centos7(一)
1.点击:创建虚拟机 2.选择:自定义(高级),下一步 3.点击:下一步 4.选择:稍后安装操作系统,下一步 5.选择:操作系统和对应的版本,下一步 6.设置:虚拟机名称和安装位置,下一步 7.设置: ...
- 用js实现千位分隔符
function mm(num) { return num && num .toString() .replace(/(\d)(?=(\d{3})+\.)/g, function($0 ...
- extjs grid demo
Ext.onReady(function () { var store = Ext.create('Ext.data.Store', { fields: ['id', 'name', 'account ...