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的最短路径,显然就是:在 ...
随机推荐
- 使用Fragment实现类似TabHost标签栏的效果
在前几天,我写了篇<Android TabHost的使用>简单的介绍了其使用的方法,但是在实现的时候发现TabHost已经被官方遗弃了.虽然我觉得TabHost还是多好用的(可能因为我这种 ...
- ASP.net程序在本地操作正确,新电脑不正确的处理经验
一.可能是计算机操作系统位数不兼容的问题,如下处理后即可.
- box-shadow 与 filter:drop-shadow 详解及奇技淫巧
box-shadow 在前端的 CSS 编写工作想必十分常见.但是 box-shadow 除去它的常规用法,其实还存在许多不为人知的奇技淫巧. 喜欢 markdown 版本的可以戳这里. box-sh ...
- C#下如何用NPlot绘制期货股票K线图(3):设计要显示的股票价格图表窗口并定义相应类的成员及函数
[内容简介] 上一篇介绍了要显示K线图所需要的数据结构,及要动态显示K线图,需要动态读取数据文件必需的几个功能函数.本篇介绍要显示蜡烛图所用到的窗口界面设计及对应类定义.下面分述如下: [窗口界面] ...
- MFC Tips(一) 在程序内部 保存读取配置
//保存 CWinApp *pApp = AfxGetApp(); pApp->WriteProfileBinary(..); //保存结构体 pApp->WriteProfileInt( ...
- java新手笔记11 类的静态属性、方法(单例)
1.Person类 package com.yfs.javase; public class Person { String name;//每个对象上分配 与对象绑定 int age; char se ...
- 【Java咬文嚼字】关键字(二):八个基本数据类型
本次谈谈java中的基本数据类型.java中8个基本数据类型说多不多说少也不少,相对简单的记忆方式:整数型(byte,short,int,long).浮点型(float,double).逻辑型(boo ...
- sublime_2014-11-19
http://xionggang163.blog.163.com/blog/static/376538322013930104310297/ 直接输入注册码就可以了 ----- BEGIN LICEN ...
- LINUX开机启动过程
LINUX开机启动过程 启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息 ...
- Java基础巩固----泛型
注:参考书籍:Java语言程序设计.本篇文章为读书笔记,供大家参考学习使用 1.使用泛型的主要优点是能够在编译时而不是在运行时检查出错误,提高了代码的安全性和可读性,同时也提高了代码的复用性. 1.1 ...