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

Problem Description
After World War X, a lot of cities have been seriously damaged, and we need to rebuild those cities. However, some materials needed can only be produced in certain places. So we need to transport these materials from city to city. For most of roads had been totally destroyed during the war, there might be no path between two cities, no circle exists as well.
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.
 
Input
Input consists of multiple problem instances.For each instance, first line contains three integers n, m and c, 2<=n<=10000, 0<=m<10000, 1<=c<=1000000. n represents the number of cities numbered from 1 to n. Following m lines, each line has three integers i, j and k, represent a road between city i and city j, with length k. Last c lines, two integers i, j each line, indicates a query of city i and city j.
 
Output
For each problem instance, one line for each query. If no path between two cities, output “Not connected”, otherwise output the length of the shortest path between them.
 
Sample Input
5 3 2
1 3 2
2 4 3
5 2 3
1 4
4 5
 
Sample Output
Not connected
6
模板题,注意该题图不连通,在tarjan算法中将d[]设为-1.
RMQ+LCA,在线算法
#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应用:求两点之间距离,图不连通)的更多相关文章

  1. 求两点之间距离 C++

    求两点之间距离(20 分) 定义一个Point类,有两个数据成员:x和y, 分别代表x坐标和y坐标,并有若干成员函数. 定义一个函数Distance(), 用于求两点之间的距离.输入格式: 输入有两行 ...

  2. UESTC(LCA应用:求两点之间的距离)

    Journey Time Limit: 15000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Bob has ...

  3. C#面向对象思想计算两点之间距离

    题目为计算两点之间距离. 面向过程的思维方式,两点的横坐标之差,纵坐标之差,平方求和,再开跟,得到两点之间距离. using System; using System.Collections.Gene ...

  4. 武汉科技大学ACM :1006: 零起点学算法25——求两点之间的距离

    Problem Description 输入平面坐标系中2点的坐标,输出它们之间的距离 Input 输入4个浮点数x1 y1 x2 y2,分别是点(x1,y1) (x2,y2)的坐标(多组数据) Ou ...

  5. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

  6. JavaScript求两点之间相对于Y轴的顺时针旋转角度

    需求: 已知一个向量,初始位置在y轴方向,如图红色箭头,绕中心点(x1, y1)旋转若干角度后,到达Line(x2,y2 x1,y1)的位置,求旋转角度 分析: 坐标点(x1, y1)(x2, y2) ...

  7. C# 通过GPS坐标,计算两点之间距离

    之前在网上有很多这种计算的,但是代码都不怎么全.经过多方打听查询.找到完整代码.现将代码共享给大家. 有需要者觉得有用者欢迎使用.觉得用或简单的高手,请绕. public static double ...

  8. 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 ...

  9. sql 根据两点经纬度算出两点之间距离

    select (sqrt( ( ((121.544685-longitude)*PI()*12656*cos(((31.134857+latitude)/2)*PI()/180)/180) * ((1 ...

随机推荐

  1. 手把手教你安装Hbase,一次成功!

    安装环境: OS: Centos 6.5 JDK: jdk1.6.0_18 Hadoop: hadoop-0.20.2 Hbase: hbase-0.90.5 安装准备: 1.       Jdk环境 ...

  2. iOS开发UI篇—懒载入

    iOS开发UI篇-懒载入 1.懒载入基本 懒载入--也称为延迟载入,即在须要的时候才载入(效率低,占用内存小).所谓懒载入,写的是其get方法. 注意:假设是懒载入的话则一定要注意先推断是否已经有了. ...

  3. hadoop集群搭建datenode为0问题的解决

       搭建了一个小的实验集群,一共4台机器,一台namenode,三台datenode.运行start-all,发如今namenode上没有报不论什么错误,可是启动后直接显示datenode数量为0. ...

  4. 递归计算战士打靶S次打了N环一共同拥有多少种可能的问题

    问题描写叙述 一个战士打了10次靶.一共打了90环,问一共同拥有多少种可能,并输出这些可能的组合. 思路 首先.嵌套10层循环进行穷举是不可取的,一是由于速度太慢,二是假设改成打20次靶就完蛋了. 事 ...

  5. 系统安全-LDAP

    LDAP服务器 1.目录服务  目录是一个为查询.浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好像Linux/Unix系统中的文件目录一样.目录数据库和关系数据库不同,它有优异的读性能 ...

  6. Machine Learning: 一部气势恢宏的人工智能发展史

    转载自:雷锋网 本文作者:陈圳 2016-09-12 09:46 导语:机器学习的从产生,发展,低潮和全盛的历史 雷锋网(公众号:雷锋网)按:本文作者DataCastle数据城堡,主要介绍了机器学习的 ...

  7. oracle sql修改序列为当前序列开始

    declare   v_num integer;  last_value integer;Begin  select SEQ_TBM_ID.NEXTVAL into last_value from d ...

  8. C++ 中的几种初始化

    前言 阅读C++教材时,想必你听过复制初始化,直接初始化,值初始化这三个概念吧.笔者本人常将其混淆,遂在此记录下它们的具体含义以便日后查阅. 复制初始化( copy-initialization ) ...

  9. 在Mac OS中配置CMake的详细图文教程http://blog.csdn.net/baimafujinji/article/details/78588488

    CMake是一个比make更高级的跨平台的安装.编译.配置工具,可以用简单的语句来描述所有平台的安装(编译过程).并根据不同平台.不同的编译器,生成相应的Makefile或者project文件.本文主 ...

  10. 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 ...