仙人掌上的最短路,这里有详细的题解
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. ACM——线性表操作

    线性表操作 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte总提交:2795            测试通过:589 描述 线性表是n个元素 ...

  2. LINQ里的Distinct()

    IQueryable 继承自IEnumerable 先举例: #region linq to object List<People> peopleList = new List<Pe ...

  3. 【转】【SQLServer】SQL Server 2008“阻止保存要求重新创建表的更改”

    不是很理解为什么在2008中会加入阻止保存要求重新创建表的更改这个选项.症状表现为修改表结构的时候会"阻止"你.而且我遇到的情况是居然有的时候阻止你,有的时候不阻止你,摸不到头脑. ...

  4. Java—static、this、super用法总结

        通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.(理解为加了static的就是全局变量)但是,并不是说有了这种便利,你便可 ...

  5. Objective-C 中的方法回掉

    Objective-C 中的方法回掉  Objective-C 中的方法调用 OC 类似C+,避免不了的内部的各种通信手段,函数调用,变量传递等,避免不了各种回掉等. 一.class直接调用 或者 o ...

  6. java新手笔记22 接口示例2

    1.USB package com.yfs.javase; public interface USB { //定义规范 public void read(); public void write(); ...

  7. JAVA IDE下载地址

    Subclipse 各版本官网下载地址: http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240 Eclipse ...

  8. Windows下Eclipse+PyDev配置Python开发环境

    1.简介 Eclipse是一款基于Java的可扩展开发平台.其官方下载中包括J2EE.Java.C/C++.Android等诸多版本.除此之外,Eclipse还可以通过安装插件的方式进行包括Pytho ...

  9. VS2010配置目录,解决:error MSB6006: “CL.exe”已退出,代码为 5问题

    配置属性->VC++目录 可执行文件目录:$(VCInstallDir)bin;$(WindowsSdkDir)bin\NETFX 4.0 Tools;$(WindowsSdkDir)bin;$ ...

  10. Peter Pan By: J. M. Barrie

    Audio book: (mp3+txt) http://www.booksshouldbefree.com/book/peter-pan-by-j-m-barrie