仙人掌上的最短路,这里有详细的题解
http://pan.baidu.com/s/1wzCpC
我觉得讲的很清楚,不懂的见代码注释吧

 type node=record
po,next,num:longint;
end; var e,w:array[..] of node;
dfn,low,p,q,mark,s,d,dis,dep,fa:array[..] of longint;
anc:array[..,..] of longint;
v:array[..] of boolean;
st:array[..] of longint;
t,h,i,len,x,y,z,n,m,tot,qq:longint; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; procedure add(x,y,z:longint);
begin
inc(len);
e[len].po:=y;
e[len].next:=p[x];
e[len].num:=z;
p[x]:=len;
end; procedure fadd(x,y:longint);
begin
inc(len);
w[len].po:=y;
w[len].next:=q[x];
q[x]:=len;
end; procedure spfa;
var f,r,i,x,y:longint;
begin
f:=;
r:=;
st[]:=;
for i:= to n do //d[]表示根节点到其他节点的最短路
d[i]:=;
while f<=r do
begin
x:=st[f];
i:=p[x];
v[x]:=false;
while i<> do
begin
y:=e[i].po;
if d[y]>d[x]+e[i].num then
begin
d[y]:=d[x]+e[i].num;
if not v[y] then
begin
inc(r);
st[r]:=y;
v[y]:=true;
end;
end;
i:=e[i].next;
end;
inc(f);
end;
end; procedure get(x,y:longint);
begin
inc(tot);
while y<>x do
begin
mark[y]:=tot; //环上节点(除最高点)标为同一颜色
fadd(x,y); //建“杨天”树
y:=fa[y];
end;
end; procedure dfs1(x:longint);
var i,y:longint;
begin
inc(h);
dfn[x]:=h;
low[x]:=h;
i:=p[x];
while i<> do
begin
y:=e[i].po;
if fa[x]<>y then
begin
if dfn[y]= then
begin
fa[y]:=x;
dis[y]:=dis[x]+e[i].num; //dis[]表示得到的dfs树上根节点到节点的距离
dfs1(y);
end;
low[x]:=min(low[x],low[y]);
if low[y]>dfn[x] then
fadd(x,y); //dfs树的树边
end;
i:=e[i].next;
end;
i:=p[x];
while i<> do
begin
y:=e[i].po;
if (dfn[y]>dfn[x]) and (fa[y]<>x) then
begin
get(x,y); //处理环
s[tot]:=dis[y]-dis[x]+e[i].num; //求这个环的长度
end;
i:=e[i].next;
end;
end; procedure dfs2(x:longint);
var i,y:longint;
begin
for i:= to t do
begin
y:=anc[x,i-];
if y<> then anc[x,i]:=anc[y,i-] else break;
end;
i:=q[x];
while i<> do
begin
y:=w[i].po;
fa[y]:=x;
anc[y,]:=x;
dep[y]:=dep[x]+; //在杨天树上的深度
dfs2(y);
i:=w[i].next;
end;
end; function lca(x,y:longint):longint;
var i,p,a,b,z:longint;
begin
if x=y then exit(); //注意
if dep[x]<dep[y] then
begin
p:=x; x:=y; y:=p;
end;
a:=x;
b:=y;
p:=trunc(ln(dep[x])/ln());
if dep[a]>dep[b] then
begin
for i:=p downto do
if dep[a]- shl i>=dep[b] then a:=anc[a,i];
end;
if a=b then exit(d[x]-d[a]); //如果点a是点x的祖先那么a,x之间最短距离为d[x]-d[a]
for i:=p downto do
if (anc[a,i]<>anc[b,i]) then
begin
a:=anc[a,i];
b:=anc[b,i];
end;
z:=fa[a];
if (mark[a]<>) and (mark[a]=mark[b]) then //最后提到环上两点要讨论
begin
p:=abs(dis[a]-dis[b]);
exit(d[x]-d[a]+d[y]-d[b]+min(p,s[mark[a]]-p));
end
else exit(d[x]+d[y]-*d[z]); //否则直接当树做
end; begin
readln(n,m,qq);
for i:= to m do
begin
readln(x,y,z);
add(x,y,z);
add(y,x,z);
end;
t:=trunc(ln(n)/ln());
spfa;
len:=;
dfs1();
dfs2();
for i:= to qq do
begin
readln(x,y);
writeln(lca(x,y));
end;
end.

bzoj2125 3047的更多相关文章

  1. 【BZOJ 3242】【UOJ #126】【CodeVS 3047】【NOI 2013】快餐店

    http://www.lydsy.com/JudgeOnline/problem.php?id=3242 http://uoj.ac/problem/126 http://codevs.cn/prob ...

  2. HDU 3047

    http://acm.hdu.edu.cn/showproblem.php?pid=3047 和hdu 3038以及poj那个食物链一样,都是带权并查集,此题做法和hdu 3038完全相同,具体操作看 ...

  3. 【HDOJ】3047 Zjnu Stadium

    带权并查集. /* 3047 */ #include <iostream> #include <string> #include <map> #include &l ...

  4. hdu 3047 Zjnu Stadium

    http://acm.hdu.edu.cn/showproblem.php?pid=3047 带权并差集 #include <cstdio> #include <cstring> ...

  5. Sublime Text 3 Build 3047 32bit/64bit 简体中文安装破解版

    Sublime Text 3 Build 3047 32bit/64bit 简体中文安装破解版 Sublime Text 3 Build 3047 32bit 简体中文安装破解版下载:http://y ...

  6. POJ 3047 Bovine Birthday 日期定周求 泽勒公式

    标题来源:POJ 3047 Bovine Birthday 意甲冠军:.. . 思考:式 适合于1582年(中国明朝万历十年)10月15日之后的情形 公式 w = y + y/4 + c/4 - 2* ...

  7. 【BZOJ2125】最短路(仙人掌,圆方树)

    [BZOJ2125]最短路(仙人掌,圆方树) 题面 BZOJ 求仙人掌上两点间的最短路 题解 终于要构建圆方树啦 首先构建出圆方树,因为是仙人掌,和一般图可以稍微的不一样 直接\(tarjan\)缩点 ...

  8. HDU 3047 Zjnu Stadium(带权并查集)

    http://acm.hdu.edu.cn/showproblem.php?pid=3047 题意: 给出n个座位,有m次询问,每次a,b,d表示b要在a右边d个位置处,问有几个询问是错误的. 思路: ...

  9. [BZOJ2125]最短路(圆方树DP)

    题意:仙人掌图最短路. 算法:圆方树DP,$O(n\log n+Q\log n)$ 首先建出仙人掌圆方树(与点双圆方树的区别在于直接连割边,也就是存在圆圆边),然后考虑点u-v的最短路径,显然就是:在 ...

随机推荐

  1. onMouseDown onMouseUp onMouseMove(移动鼠标图像大小变化)

  2. 关于IOS网络通信的学习

    最近由于需要在看关于网络通信方面的知识,所以在网上找了找关于网络解释方面的知识.找了半天没有找到一篇能详细解释通讯流程的,心里忍不住就万马奔腾了.没办法,谁让自己想学呢!于是又找了找,觉得没有满意的. ...

  3. cordova 创建ios项目

    cordova create fmscmsios1023 com.weilian.fmscms fmscms cd fmscms cd fmscmsios1023/ cordova platforms ...

  4. Java工具类:获取long型唯一ID

    直接上代码: import java.text.SimpleDateFormat; import java.util.Date; /** * 获取long型唯一ID */ public class I ...

  5. scrapy抓取到中文,保存到json文件为unicode,如何解决.

    http://scrapy-chs.readthedocs.org/zh_CN/latest/intro/overview.html 以上链接是很好的scrapy学些资料.感谢marchtea的翻译. ...

  6. bzoj2618[Cqoi2006]凸多边形 半平面交

    这是一道半平面交的裸题,第一次写半平面交,就说一说我对半平面交的理解吧. 所谓半平面交,就是求一大堆二元一次不等式的交集,而每个二元一次不等式的解集都可以看成是在一条直线的上方或下方,联系直线的标准方 ...

  7. Cookies和Sseeion的选择

    Cookies和Session都是用来记录个人信息  来保持页面状态 现在介绍些Cookies 的优点 1 把存储数据的压力分担到了客户端 ,这样服务器就少点压力 2 可以用来记录用户状态(如放入用户 ...

  8. 网站开发常用jQuery插件总结(14)图片修剪插件Jcrop

    一.插件功能 用于对图片进行修剪.但是在使用Jcrop时,还需要配合服务器端开发语言(如asp.net,php等)使用. 二.官方地址 http://deepliquid.com/content/Jc ...

  9. Python深入学习笔记(一)

    写在前面的话 从08年接触Python到现在,断断续续地使用,到如今Python已经成为日常事物处理.科研实验,甚至工程项目的主力语言,主要因为其敏捷性和快速实现的能力.虽然看了一些Python的教程 ...

  10. Linux文件3个时间点(access time,modify time,change time)

    在Linux中使用stat命令来查看文件的详细信息. 如图所示,会出现3个类型的时间,分别是Access,Modify,Change. access time:表示最后一次访问(仅仅是访问,没有改动) ...