bzoj2125 3047
仙人掌上的最短路,这里有详细的题解
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的更多相关文章
- 【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 ...
- HDU 3047
http://acm.hdu.edu.cn/showproblem.php?pid=3047 和hdu 3038以及poj那个食物链一样,都是带权并查集,此题做法和hdu 3038完全相同,具体操作看 ...
- 【HDOJ】3047 Zjnu Stadium
带权并查集. /* 3047 */ #include <iostream> #include <string> #include <map> #include &l ...
- hdu 3047 Zjnu Stadium
http://acm.hdu.edu.cn/showproblem.php?pid=3047 带权并差集 #include <cstdio> #include <cstring> ...
- Sublime Text 3 Build 3047 32bit/64bit 简体中文安装破解版
Sublime Text 3 Build 3047 32bit/64bit 简体中文安装破解版 Sublime Text 3 Build 3047 32bit 简体中文安装破解版下载:http://y ...
- POJ 3047 Bovine Birthday 日期定周求 泽勒公式
标题来源:POJ 3047 Bovine Birthday 意甲冠军:.. . 思考:式 适合于1582年(中国明朝万历十年)10月15日之后的情形 公式 w = y + y/4 + c/4 - 2* ...
- 【BZOJ2125】最短路(仙人掌,圆方树)
[BZOJ2125]最短路(仙人掌,圆方树) 题面 BZOJ 求仙人掌上两点间的最短路 题解 终于要构建圆方树啦 首先构建出圆方树,因为是仙人掌,和一般图可以稍微的不一样 直接\(tarjan\)缩点 ...
- HDU 3047 Zjnu Stadium(带权并查集)
http://acm.hdu.edu.cn/showproblem.php?pid=3047 题意: 给出n个座位,有m次询问,每次a,b,d表示b要在a右边d个位置处,问有几个询问是错误的. 思路: ...
- [BZOJ2125]最短路(圆方树DP)
题意:仙人掌图最短路. 算法:圆方树DP,$O(n\log n+Q\log n)$ 首先建出仙人掌圆方树(与点双圆方树的区别在于直接连割边,也就是存在圆圆边),然后考虑点u-v的最短路径,显然就是:在 ...
随机推荐
- CSS3 transition-timing-function
CSS3 transition-timing-function 属性 定义和用法 transition-timing-function 属性规定过渡效果的速度曲线. 该属性允许过渡效果随着时间来改变其 ...
- iOS-开发记录-UIView属性
UIView属性 1.alpha 设置视图的透明度.默认为1. // 完全透明 view.alpha = ; // 不透明 view.alpha = ; 2.clipsToBounds // 默认是N ...
- AngularJS2学习
@Input @Input是用来定义模块的输入的,用来让父模块往子模块传递内容: @Component({ selector: 'bank-account', template: ` Bank Nam ...
- 《程序员的思维修炼》摘抄start:2014年9月27日19:27:07
程序员的思维修炼:摘抄:考虑到社会中各个相关团体的复杂交互影响和社会的持续变化,在我看来当前最重要的两项技能就是: ▪沟通能力: ▪学习和思考能力.软件行业正在逐步提高沟通能力.特别是敏捷方法(见注解 ...
- UVA 10739 String to Palindrome(动态规划 回文)
String to Palindrome 题目大意:给出一个字符串s,现在可以进行3种操作(添加字母,删除字母,替换字母),将其变成回文串,求出最少的操作次数.比如abccda,可以用删除操作,删除b ...
- (转)Xcode 中设置部分文件ARC支持
ARC是什么 ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting).简单地说,就是代码中自动加入了retain/release,原先需要手动添加的 ...
- JavaWeb用户登录功能的实现
大四快毕业了,3年多的时间中,乱七八糟得学了一大堆,想趁找工作之前把所学的东西整理一遍,所以就尝试着做一个完整的JavaWeb系统,这几天试着做了一个用户登录的功能,分享给大家,肯定有很多不完善的地方 ...
- Check Mysql Database Size
SELECT ROUND( SUM(data_length + index_length) / 1024 / 1024 ) TOTAL_MB, ROUND(SUM(data_length) / 102 ...
- php接收二进制数据流转换成图片
<?php /** * 图片类 * @author Haroldphp@163.com * @version 1.0 * PHP默认只识别application/x-www.form-urlen ...
- 【python之旅】python的基础三
目录: 1.装饰器 2.迭代器&生成器 3.Json & pickle 数据序列化 4.软件目录结构规范 一.装饰器 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能 原 ...