Connections between cities
Connections between cities |
| Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
| Total Submission(s): 896 Accepted Submission(s): 236 |
|
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 |
|
Sample Output
Not connected Hint
Hint Huge input, scanf recommended. |
|
Source
2009 Multi-University Training Contest 8 - Host by BJNU
|
|
Recommend
gaojie
|
/*
用vector炸了,还是用邻接表卡过的
*/
#include<bits/stdc++.h>
using namespace std;
#define M 10007
#define N 2222212
int bin[M],dis[M],vis[M],cur[N],root[M];
int s1[N],s2[N],t[N],d[N],p[N];
int n,m,ne,cnt; int find(int x)
{
while(x!=bin[x])
x=bin[x];
return x;
} void add(int u,int v,int w,int h[])
{
t[ne]=v,d[ne]=w,p[ne]=h[u],h[u]=ne++;
t[ne]=u,d[ne]=w,p[ne]=h[v],h[v]=ne++;
}
/*
LCA算法以某一个节点作为根节点,开始遍历,遍历到一个结点先判断与它相关的结点是不是有已经被访问过的,
如果有的话,判断两个结点是不是在同一棵树上,如果是的话就保留最近公共祖先的距离,如果不是的话,就是不能到达,距离就赋值为-1 */
void LCA(int u)
{
root[u]=cnt;
bin[u]=u;
vis[u]=;
//遍历查询树
for(int i=s2[u];i;i=p[i])
{
int v=t[i];
if(vis[v])
{
if(root[u]==root[v])//在同一棵树下
{
int rt=find(v);//最近公共祖先
cur[d[i]]=dis[u]+dis[v]-*dis[rt];
}
else
cur[d[i]]=-;
} }
//遍历城市图
for(int i=s1[u];i;i=p[i])
{
int v=t[i];
if(!vis[v])
{
dis[v]=dis[u]+d[i];
LCA(v);
bin[v]=u;//路径压缩
}
}
} int main()
{
//freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin);
int n,m,q,i,j;
while(scanf("%d%d%d",&n,&m,&q)!=EOF)
{
for(i=,ne=;i<=n;i++)
{
s1[i]=s2[i]=vis[i]=cur[i]=root[i]=bin[i]=;
}
int u,v,w;
for(i=;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w,s1);
}
for(i=;i<=q;i++)
{
scanf("%d%d",&u,&v);
add(u,v,i,s2);
}
for(i=,cnt=;i<=n;i++,cnt++)
if(!vis[i])
{
dis[i]=;
LCA(i);
} for(i=;i<=q;i++)
if(cur[i]>=)
printf("%d\n",cur[i]);
else
printf("Not connected\n");
}
return ;
}
#include<bits/stdc++.h>
#define N 10005
using namespace std;
int n,m,c;
int bin[N];
int root[N];//表示点i的根节点
int roo;//表示当前是以哪个结点为根节点遍历的
int dis[N];//标记结点i到根结点的距离
int vis[N];//标记i点是否被访问过
int cur[N];//表示第几组解
int op[N][N];//表示解是第几组
struct node
{
int v,val;
node(){}
node(int a,int b)
{
v=a;
val=b;
}
};
vector<node>edge[N];
vector<node>edg[N];
int findx(int x)
{
while(x!=bin[x])
x=bin[x];
return x;
}
/*
Tarjan算法以某一个节点作为根节点,开始遍历,遍历到一个结点先判断与它相关的结点是不是有已经被访问过的,
如果有的话,判断两个结点是不是在同一棵树上,如果是的话就保留最近公共祖先的距离,如果不是的话,就是不能到达,距离就赋值为-1 */
int LCA(int u)
{
//首先遍历查询树
root[u]=roo;
vis[u]=;
bin[u]=u;
for(int i=;i<edg[u].size();i++)
{
int nex=edg[u][i].v;
if(vis[nex]==)//这个点遍历过了
{
if(root[u]==root[nex])
{
int rt=findx(nex);
cur[op[u][nex]]=dis[u]+dis[nex]-*dis[rt];//
}
else
cur[op[u][nex]]=-;
}
}
//然后就是遍历程城市树
for(int i=;i<edge[u].size();i++)
{
int nex=edge[u][i].v;
if(vis[nex]) continue;
dis[nex]=dis[u]+edge[u][i].val;//父节点到根节点的距离,加上到父节点的距离
LCA(nex);
bin[nex]=u;//路径压缩
}
}
int x,y,val;
void inti()
{
for(int i=;i<=n;i++)
{
edge[i].clear();
edg[i].clear();
bin[i]=i;
cur[i]=-;
dis[i]=;
vis[i]=;
}
}
int main()
{
//freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin);
while(scanf("%d%d%d",&n,&m,&c)!=EOF)
{
inti();
//构建城市的图
for(int i=;i<m;i++)
{
scanf("%d%d%d",&x,&y,&val);
edge[x].push_back(node(y,val));
edge[y].push_back(node(x,val));
}
//构建查询树
for(int i=;i<c;i++)
{
scanf("%d%d",&x,&y);
op[x][y]=op[y][x]=i;
edg[x].push_back(node(y,));
edg[y].push_back(node(x,));
}
for(int i=;i<=n;i++)
{
if(!vis[i])
{
roo=i;
dis[i]=;
LCA(i);
}
}
for(int i=;i<c;i++)
{
if(cur[i]==-)
puts("Not connected");
else
printf("%d\n",cur[i]);
}
}
return ;
}
Connections between cities的更多相关文章
- hdu 2874 Connections between cities [LCA] (lca->rmq)
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- HDU 2874 Connections between cities(LCA Tarjan)
Connections between cities [题目链接]Connections between cities [题目类型]LCA Tarjan &题意: 输入一个森林,总节点不超过N ...
- hdu 2874 Connections between cities 带权lca判是否联通
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- hdu 2874 Connections between cities(st&rmq LCA)
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- hdu 2874 Connections between cities (并查集+LCA)
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- hdu-2874 Connections between cities(lca+tarjan+并查集)
题目链接: Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/327 ...
- HDU 2874 Connections between cities(LCA)
题目链接 Connections between cities LCA的模板题啦. #include <bits/stdc++.h> using namespace std; #defin ...
- HDU——2874 Connections between cities
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- Connections between cities LCA
Problem Description After World War X, a lot of cities have been seriously damaged, and we need to r ...
随机推荐
- 转换时间对象和字符串对象&添加时间
/* *基本思路,将字符串时间转化为时间对象,通过毫秒数来加减时间,然后在转化为字符串输出 */ //转化字符时间yy-mm-dd hh:mm:ss 为时间对象 使用split进行字符串的分割,取 ...
- 【JavaScript】设计模式-module模式及其改进
写在前面 编写易于维护的代码,其中最重要的方面就是能够找到代码中重复出现的主题并优化他们,这也是设计模式最有价值的地方 说到这里...... <head first设计模式>里有一篇文章, ...
- 网页meta标签总结
文章摘抄自网络. 参考文章:http://www.cnblogs.com/lpt1229/p/5628631.html http://blog.csdn.net/aiolos1111/article/ ...
- Java常用异常整理
填坑,整理下Java的常用异常.正确使用异常在实际编码中非常重要,但面试中的意义相对较小,因为对异常的理解和应用很难通过几句话或几行代码考查出来,不过我们至少应答出三点:异常类的继承关系.常用异常类. ...
- Corn Fields poj3254(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6081 Accepted: 3226 Descr ...
- 关于el-dialog,我更推荐的用法
最近的项目里用上了vue和element-ui.vue这种轻量级渐进式框架的舒适自不必说,但一直困扰着我的,是如何方便又优雅的弹出模态dialog... 对于我这种在jquery出现之前就用docum ...
- struts2中的Ajax异步校验
登录时验证码的异步校验: 1.验证码生成的是图片因此在struts.xml文件里面配置action 时,result标签中type 属性是stream 2.验证码图片的src的值为配置action名字 ...
- html5获取用户当前的地理位置,即经纬度。
$("document").ready(function(){ getMap(); }); function getMap(){ // 百度地图API功能 var map = ne ...
- 简单Elixir游戏服设计-玩家进程跑起来
有了玩家模型,我们试试让玩家进程跑起来. 需要搞个PlayerSupervisor来负责启动和监控玩家进程. defmodule PlayerSupervisor do use Supervisor ...
- 【Learning】多项式乘法与快速傅里叶变换(FFT)
简介: FFT主要运用于快速卷积,其中一个例子就是如何将两个多项式相乘,或者高精度乘高精度的操作. 显然暴搞是$O(n^2)$的复杂度,然而FFT可以将其将为$O(n lg n)$. 这看起来十分玄学 ...