HDU2874(LCA应用:求两点之间距离,图不连通)
Connections between cities
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7716 Accepted Submission(s): 1930
Now, your task comes. After giving you the condition of the roads, we want to know if there exists a path between any two cities. If the answer is yes, output the shortest path between them.
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAXN=;
struct Edge{
int to,cost,next;
}es[MAXN*];
int head[MAXN],tot;
void add_edge(int u,int v,int cost)
{
es[tot].to=v;
es[tot].cost=cost;
es[tot].next=head[u];
head[u]=tot++;
}
int V,E,Q;
int dp[MAXN*][];
int depth[MAXN*];
int vs[MAXN*];
int id[MAXN];
int cnt,dep;
int d[MAXN];
void dfs(int u,int fa)
{
int temp=++dep;
depth[++cnt]=temp;
vs[temp]=u;
id[u]=cnt;
for(int i=head[u];i!=-;i=es[i].next)
{
int to=es[i].to;
if(to==fa) continue;
d[to]=d[u]+es[i].cost;
dfs(to,u);
depth[++cnt]=temp;
}
} void init_rmq(int n)
{
for(int i=;i<=n;i++) dp[i][]=depth[i]; int m=floor(log(n*1.0)/log(2.0));
for(int j=;j<=m;j++)
for(int i=;i<=n-(<<j)+;i++)
dp[i][j]=min(dp[i][j-],dp[i+(<<(j-))][j-]);
}
int rmq(int a,int b)
{
int k=floor(log((b-a+)*1.0)/log(2.0));
return min(dp[a][k],dp[b-(<<k)+][k]);
}
int LCA(int u,int v)
{
if(id[u]>id[v]) swap(u,v);
int k=rmq(id[u],id[v]);
return vs[k];
} int par[MAXN],rnk[MAXN];
void init_set(int n)
{
for(int i=;i<=n;i++)
{
par[i]=i;
rnk[i]=;
}
}
int fnd(int x)
{
if(par[x]==x)
return x;
return par[x]=fnd(par[x]);
}
void unite(int x,int y)
{
int a=fnd(x);
int b=fnd(y);
if(a==b) return ;
if(rnk[a]<rnk[b])
{
par[a]=b;
}
else
{
par[b]=a;
if(rnk[a]==rnk[b]) rnk[a]++;
}
}
bool same(int x,int y)
{
return fnd(x) == fnd(y);
}
int main()
{
while(scanf("%d%d%d",&V,&E,&Q)!=EOF)
{
tot=;
memset(head,-,sizeof(head));
cnt=;
dep=;
memset(d,,sizeof(d));
memset(id,,sizeof(id));
init_set(V);
for(int i=;i<E;i++)
{
int u,v,cost;
scanf("%d%d%d",&u,&v,&cost);
add_edge(u,v,cost);
add_edge(v,u,cost);
unite(u,v);
}
for(int i=;i<=V;i++)
if(!id[i]) dfs(i,-);
init_rmq(cnt);
while(Q--)
{
int u,v;
scanf("%d%d",&u,&v);
if(same(u,v))
{
printf("%d\n",d[u]+d[v]-*d[LCA(u,v)]);
}
else
{
printf("Not connected\n");
}
}
}
return ;
}
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
const int MAXN=;
struct Edge{
int to,cost,next;
}es[*MAXN];
int V,E,Q;
struct Query{
int v,next;
}qs[*MAXN];
int head[MAXN],tot;
void add_edge(int u,int v,int cost)
{
es[tot].to=v;
es[tot].cost=cost;
es[tot].next=head[u];
head[u]=tot++;
}
int qhead[MAXN],ant;
void add_query(int u,int v)
{
qs[ant].v=v;
qs[ant].next=qhead[u];
qhead[u]=ant++;
} int d[MAXN];
int ans[*MAXN];
int par[MAXN];
bool vis[MAXN];
int fnd(int x)
{
if(x==par[x])
return x;
return par[x]=fnd(par[x]);
}
void dfs(int u,int fa)
{
par[u]=u;
vis[u]=true;
for(int i=head[u];i!=-;i=es[i].next)
{
int v=es[i].to;
if(vis[v]) continue;
d[v]=d[u]+es[i].cost;
dfs(v,u);
par[v]=u;
}
for(int i=qhead[u];i!=-;i=qs[i].next)
{
int v=qs[i].v;
if(vis[v])
{
if(d[v]!=-)
ans[i/]=d[u]+d[v]-*d[fnd(v)];
else
ans[i/]=-;
}
}
}
int main()
{
while(~scanf("%d %d %d",&V,&E,&Q))
{
tot=;
memset(head,-,sizeof(head));
ant=;
memset(qhead,-,sizeof(qhead));
memset(vis,false,sizeof(vis));
for(int i=;i<E;i++)
{
int u,v,cost;
scanf("%d%d%d",&u,&v,&cost);
add_edge(u,v,cost);
add_edge(v,u,cost);
}
for(int i=;i<Q;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add_query(u,v);
add_query(v,u);
}
for(int i=;i<=V;i++)
if(!vis[i])
{
memset(d,-,sizeof(d));
d[i]=;
dfs(i,-);
}
for(int i=;i<Q;i++)
if(ans[i]==-) printf("Not connected\n");
else printf("%d\n",ans[i]);
}
return ;
}
HDU2874(LCA应用:求两点之间距离,图不连通)的更多相关文章
- 求两点之间距离 C++
求两点之间距离(20 分) 定义一个Point类,有两个数据成员:x和y, 分别代表x坐标和y坐标,并有若干成员函数. 定义一个函数Distance(), 用于求两点之间的距离.输入格式: 输入有两行 ...
- UESTC(LCA应用:求两点之间的距离)
Journey Time Limit: 15000/3000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Bob has ...
- C#面向对象思想计算两点之间距离
题目为计算两点之间距离. 面向过程的思维方式,两点的横坐标之差,纵坐标之差,平方求和,再开跟,得到两点之间距离. using System; using System.Collections.Gene ...
- 武汉科技大学ACM :1006: 零起点学算法25——求两点之间的距离
Problem Description 输入平面坐标系中2点的坐标,输出它们之间的距离 Input 输入4个浮点数x1 y1 x2 y2,分别是点(x1,y1) (x2,y2)的坐标(多组数据) Ou ...
- 求两点之间最短路径-Dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...
- JavaScript求两点之间相对于Y轴的顺时针旋转角度
需求: 已知一个向量,初始位置在y轴方向,如图红色箭头,绕中心点(x1, y1)旋转若干角度后,到达Line(x2,y2 x1,y1)的位置,求旋转角度 分析: 坐标点(x1, y1)(x2, y2) ...
- C# 通过GPS坐标,计算两点之间距离
之前在网上有很多这种计算的,但是代码都不怎么全.经过多方打听查询.找到完整代码.现将代码共享给大家. 有需要者觉得有用者欢迎使用.觉得用或简单的高手,请绕. public static double ...
- URAL 题目1553. Caves and Tunnels(Link Cut Tree 改动点权,求两点之间最大)
1553. Caves and Tunnels Time limit: 3.0 second Memory limit: 64 MB After landing on Mars surface, sc ...
- sql 根据两点经纬度算出两点之间距离
select (sqrt( ( ((121.544685-longitude)*PI()*12656*cos(((31.134857+latitude)/2)*PI()/180)/180) * ((1 ...
随机推荐
- 手把手教你安装Hbase,一次成功!
安装环境: OS: Centos 6.5 JDK: jdk1.6.0_18 Hadoop: hadoop-0.20.2 Hbase: hbase-0.90.5 安装准备: 1. Jdk环境 ...
- iOS开发UI篇—懒载入
iOS开发UI篇-懒载入 1.懒载入基本 懒载入--也称为延迟载入,即在须要的时候才载入(效率低,占用内存小).所谓懒载入,写的是其get方法. 注意:假设是懒载入的话则一定要注意先推断是否已经有了. ...
- hadoop集群搭建datenode为0问题的解决
搭建了一个小的实验集群,一共4台机器,一台namenode,三台datenode.运行start-all,发如今namenode上没有报不论什么错误,可是启动后直接显示datenode数量为0. ...
- 递归计算战士打靶S次打了N环一共同拥有多少种可能的问题
问题描写叙述 一个战士打了10次靶.一共打了90环,问一共同拥有多少种可能,并输出这些可能的组合. 思路 首先.嵌套10层循环进行穷举是不可取的,一是由于速度太慢,二是假设改成打20次靶就完蛋了. 事 ...
- 系统安全-LDAP
LDAP服务器 1.目录服务 目录是一个为查询.浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好像Linux/Unix系统中的文件目录一样.目录数据库和关系数据库不同,它有优异的读性能 ...
- Machine Learning: 一部气势恢宏的人工智能发展史
转载自:雷锋网 本文作者:陈圳 2016-09-12 09:46 导语:机器学习的从产生,发展,低潮和全盛的历史 雷锋网(公众号:雷锋网)按:本文作者DataCastle数据城堡,主要介绍了机器学习的 ...
- oracle sql修改序列为当前序列开始
declare v_num integer; last_value integer;Begin select SEQ_TBM_ID.NEXTVAL into last_value from d ...
- C++ 中的几种初始化
前言 阅读C++教材时,想必你听过复制初始化,直接初始化,值初始化这三个概念吧.笔者本人常将其混淆,遂在此记录下它们的具体含义以便日后查阅. 复制初始化( copy-initialization ) ...
- 在Mac OS中配置CMake的详细图文教程http://blog.csdn.net/baimafujinji/article/details/78588488
CMake是一个比make更高级的跨平台的安装.编译.配置工具,可以用简单的语句来描述所有平台的安装(编译过程).并根据不同平台.不同的编译器,生成相应的Makefile或者project文件.本文主 ...
- Thumbelina,摘自iOS应用Snow White and more stories
Once upon a time there was a woman who wanted to have a child. 从前,有个想要个孩子的女人. A witch heard her wish ...