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的最短路径,显然就是:在 ...
随机推荐
- MFC对话框程序EDIT类控件的自动换行,垂直滚动条自动下移
1.新建一个Edit Control,将其Multiline属性设置为True,Auto HScroll属性设置False,这样就可以实现每一行填满后自动换行了. 2.再将Vetrical Scr ...
- ios fixed属性bug解决方法
在内容层外面包一个div 加上样式:position:fixed;top:0px; bottom:50px;overflow:scroll; 就可以完美解决
- iOS 开发中的单例
在iOS开发中经常会用到单例,比如每个iOS程序本身就是一个单例,在比如进行个人偏好设置存储的时候用的也是一个单例.那我们如何自己来写一个单例类呢,用自己的单例对象呢?下面是我写的一个单例的头文件里的 ...
- objective-c内存管理中autorelease的作用
//创建自动释放池 @autoreleasepool { //autorelease会将对象放入自动释放池中,并返回该对象本身 //当自动释放池销毁时,将自动调用对象的release方法 Person ...
- Java实战之01Struts2-05contextMAP、EL、OGNL
十五.contextMap 1.动作类的生命周期 明确:动作类是多例的,每次动作访问,动作类都会实例化.所以是线程安全的.与Struts1的区别是,struts1的动作类是单例的. 2.请求动作的数据 ...
- [翻译][MVC 5 + EF 6] 3:排序、过滤、分页
原文:Sorting, Filtering, and Paging with the Entity Framework in an ASP.NET MVC Application 1.添加排序: 1. ...
- MySQL的基本使用
SQL DDL:数据定义语言 CREATE DROP ALTER DML:数据操作语言 SELECT INSERT UPDATE DELETE DCL:数据控制语言 GR ...
- android BitmapFacty.Options的用法
通常我们在开发android应用程序时,在加载图片时常常需要与Bitmap打交道,一般会使用BitmapFactory中提供的相关decode方法获取: 如果一张很大的图片,我们不加处理直接decod ...
- 一个开源的可视化的jQuery工作流插件
特点 1.跨浏览器,可兼容IE7--IE11, FireFox, Chrome, Opera等几大内核的浏览器,且不需要浏览器再加装任何控件. (IE7-IE8时,使用VML:IE9以上,FF,OPE ...
- textarea 超过字数
<textarea name="></textarea> <div id="statementRowChk"></div> ...