Codeforces Gym 100015C City Driving 离线LCA
City Driving
题目连接:
http://codeforces.com/gym/100015/attachments
Description
You recently started frequenting San Francisco in your free time and realized that driving in the city is a
huge pain. There are only N locations in the city that interest you, though, and you have decidedtotry
to improve your driving experience. Since you lack a GPS and cannot remember too many di!erent routes,
you wrote down the directions and how long it takes to get between N di!erent pairs of locations (the same
in both directions), ensuring that using only these paths you can get from any location to any other one.
Now you are planning your trip for the weekend and you need to figureoutthefastestwaytogetbetween
Q pairs of locations in the city using only the routes you have written down.
Input
The input consists of multiple test cases. The first line contains a single integer N,3 ! N ! 100,000, the
number of locations of interest and the number of routes you wrotedown.Thenext N lines each contain
three integers u, v,and w (1 ! w ! 1,000), indicating that you have directions from location u to location v
and vice-versa (0-indexed) which take w time. The following line contains a single integer Q,1 ! Q ! 10,000,
the number of pairs of locations you need to compute the travel timefor. Thenext Q lines each contain
two integers u and v, indicating that you should find the minimum time to get from location u to location
v. The input terminates with a line with N = 0. For example:
Output
For each test case, print out Q lines, one for each pair of locations u and v you are finding the fastest routes
for. Each line should simply contain the minimum time it takes to travel from location u to location v.For
example, the correct output for the sample input above would be:
Sample Input
7
0 1 2
0 2 3
1 3 2
2 3 8
2 4 3
3 5 1
1 6 7
3
4 5
0 6
1 2
0
Sample Output
11
9
5
Hint
题意
给你一个n环n边的图,问你两点之间的最短路
题解:
随便找一个环,然后在这个环上随便去掉一条边,然后就比较这个树上的距离小,还是经过这条边的饿距离小
比如你去掉的边是a,b,边权是w,你查询u,v
那么你比较dis(u,v),dis(u,a)+w+dis(b,v),dis(u,b)+w+dis(a,u)就好了
找环上的边,我推荐用并查集
代码
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
struct node
{
int x,y;
};
vector<node>G[maxn];
int dp[18][maxn*2],dis[maxn],parent[maxn],vis[maxn],pos[maxn],res[maxn];
int n,m,c,num,cnt,si;
int qx=0,qy=0,qv=0;
void init()
{
qx = qy = qv = 0;
cnt = num = si = 0;
memset(dp,0,sizeof(dp));
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
memset(res,0,sizeof(res));
memset(pos,0,sizeof(pos));
for(int i=0;i<maxn;i++)
G[i].clear();
}
int Find(int i)
{
if(i!=parent[i])
parent[i]=Find(parent[i]);
return parent[i];
}
void Union(int i,int j)
{
int x,y;
x=Find(i);
y=Find(j);
if(x!=y)
parent[x]=y;
}
void dfs3(int u,int dist)
{
int i,j;
vis[u]=1;
dis[u]=dist;
pos[u]=cnt;
res[si]=u;
dp[0][cnt++]=si++;
for(i=0;i<G[u].size();i++)
{
j=G[u][i].x;
if(!vis[j])
{
dfs3(j,dist+G[u][i].y);
dp[0][cnt++]=dp[0][pos[u]];
}
}
}
void rmq()
{
int i,j,k;
for(i=1;(1<<i)<=n;i++)
for(j=n-1;j>=0;j--)
{
k=(1<<(i-1));
dp[i][j]=dp[i-1][j];
if(k+j<n)
dp[i][j]=min(dp[i][j],dp[i-1][j+k]);
}
}
int cal(int i,int j)
{
int k;
if(i<j)swap(i,j);
k=0;
while((1<<k)<=(i-j+1))
k++;
k--;
k=min(dp[k][j],dp[k][i-(1<<k)+1]);
return res[k];
}
int Dis(int u,int v)
{
int k = cal(pos[u],pos[v]);
return dis[u]+dis[v]-dis[k]*2;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0)break;
init();
for(int i=0;i<=n;i++)
parent[i]=i;
for(int i=1;i<=n;i++)
{
int x,y,z;scanf("%d%d%d",&x,&y,&z);
x++,y++;
int p = Find(x),q = Find(y);
if(p==q){
qx = x,qy = y,qv = z;
continue;
}
Union(x,y);
G[x].push_back((node){y,z});
G[y].push_back((node){x,z});
}
for(int i=1;i<=n;i++)
if(!vis[i])
dfs3(i,0);
n=n*2-1;
rmq();
int q;
scanf("%d",&q);
while(q--)
{
int x,y;scanf("%d%d",&x,&y);
x++,y++;
int res = Dis(x,y);
res = min(res,Dis(x,qx)+Dis(y,qy)+qv);
res = min(res,Dis(x,qy)+Dis(y,qx)+qv);
printf("%d\n",res);
}
}
}
Codeforces Gym 100015C City Driving 离线LCA的更多相关文章
- Codeforces Gym 100114 H. Milestones 离线树状数组
H. Milestones Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descripti ...
- codeforces gym #101161E - ACM Tax(lca+主席树)
题目链接: http://codeforces.com/gym/101161/attachments 题意: 给出节点数为$n$的树 有$q$次询问,输出$a$节点到$b$节点路程中,经过的边的中位数 ...
- Codeforces Gym 100650B Countdown (离线)
题目链接:http://codeforces.com/gym/100650 根据给出的树和d,求出一些结点,这些结点形成子树的第d层结点数应该尽量多,具体要求可以参考题目. dfs一个结点前保存询问深 ...
- Codeforces Gym 101190M Mole Tunnels - 费用流
题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...
- HDU 5044 离线LCA算法
昨天写了HDU 3966 ,本来这道题是很好解得,结果我想用离线LCA 耍一把,结果发现离线LCA 没理解透,错了好多遍,终得AC ,这题比起 HDU 3966要简单,因为他不用动态查询.但是我还是错 ...
- Codeforces Gym 101252D&&floyd判圈算法学习笔记
一句话题意:x0=1,xi+1=(Axi+xi%B)%C,如果x序列中存在最早的两个相同的元素,输出第二次出现的位置,若在2e7内无解则输出-1. 题解:都不到100天就AFO了才来学这floyd判圈 ...
- Codeforces Gym 101623A - 动态规划
题目传送门 传送门 题目大意 给定一个长度为$n$的序列,要求划分成最少的段数,然后将这些段排序使得新序列单调不减. 考虑将相邻的相等的数缩成一个数. 假设没有分成了$n$段,考虑最少能够减少多少划分 ...
- 【Codeforces Gym 100725K】Key Insertion
Codeforces Gym 100725K 题意:给定一个初始全0的序列,然后给\(n\)个查询,每一次调用\(Insert(L_i,i)\),其中\(Insert(L,K)\)表示在第L位插入K, ...
- Codeforces gym 101343 J.Husam and the Broken Present 2【状压dp】
2017 JUST Programming Contest 2.0 题目链接:Codeforces gym 101343 J.Husam and the Broken Present 2 J. Hu ...
随机推荐
- Cent OS5.2安装Hyper-V集成光盘
一.Hyper-V安装windows系统没有问题,windows2000以后系统都可以,一切顺利. 驱动程序:IDE.SCSI.网络.视频和鼠标 要想实现更强的功能,宿主机需要安装Hyper-V集成光 ...
- 浏览器的DNS缓存
通过设置hosts文件可以强制指定域名对应的IP,当修改hosts文件,想要浏览器生效,最直接的方法关闭浏览器后重新开启:如果不想重启浏览器,只需要清空浏览器的DNS缓存即可.清空DNS缓存在chro ...
- asp.net mvc让我告诉你请求从哪里来
移动互联网的兴起,导致越来越多的网站开始看中自己的mobile站点(m站),例如我们用手机浏览器访问58,美团等网站都会看到适配的m站点,随之而来响应式布局,h5等技术随之兴起,对于一些大型网站来说, ...
- c++builder XE8 线程 Thread
thread Thread c++builder XE8 / RAD 10 Settle delphi TThread.CreateAnonymousThread(MyMethod).Start; ...
- matlab 画平面
y = :; z = ones(); surf(x,y,z):
- 转】Spark DataFrames入门指南:创建和操作DataFrame
原博文出自于: http://blog.csdn.net/lw_ghy/article/details/51480358 感谢! 一.从csv文件创建DataFrame 本文将介绍如何从csv文件创建 ...
- Axis2在Web项目中整合Spring
一.说明: 上一篇说了Axis2与Web项目的整合(详情 :Axis2与Web项目整合)过程,如果说在Web项目中使用了Spring框架,那么又改如何进行Axis2相关的配置操作呢? 二.Axis2 ...
- django 命名空间详解
include(module[, namespace=None, app_name=None ]) include(pattern_list) include((pattern_list, app_n ...
- CISCO ASA 防火墙 IOS恢复与升级
在IOS被误清除时的处理办法: 1.从tftp上的ios启动防火墙 防火墙启动后 ,按“ESC”键进入监控模式 rommon #2> ADDRESS=192.168.1.116 rommon # ...
- RGPJS 教程之八 创造场景
开始画面 游戏画面 代码 <!DOCTYPE html> <html> <head> <script src="rpg-beta-2.js" ...