BZOJ1576: [Usaco2009 Jan]安全路经Travel(树链剖分)
Description
.jpg)
Input
* 第一行: 两个空格分开的数, N和M
* 第2..M+1行: 三个空格分开的数a_i, b_i,和t_i
Output
* 第1..N-1行: 第i行包含一个数:从牛棚_1到牛棚_i+1并且避免从牛棚1到牛棚i+1最短路经上最后一条牛路的最少的时间.如果这样的路经不存在,输出-1.
Sample Input
1 2 2
1 3 2
3 4 4
3 2 1
2 4 3
输入解释:
跟题中例子相同
Sample Output
3
6
输出解释:
跟题中例子相同
解题思路:
先建出来最短路树(题目都提示到这个份上了)
然后考虑不走最后一条边那么就要从子节点走或者从一些其他非树边走。
可以证明最后只经过一条非树边
考虑非树边可以怎么走。
一条非树边可以造成的贡献就是其Lca到这两个点上的所有树边。
其答案就是ansx=disu+disv+lenu-v-disx
disx一定那么可以将disu+disv+lenu-v插入树链
最后求最小值就好了。
可以用树链剖分实现。
代码:
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
const int N=;
int tr[N<<];
struct pnt{
int hd;
int no;
int fa;
int tp;
int dp;
int dis;
int ind;
int wgt;
int mxs;
bool vis;
bool friend operator < (pnt x,pnt y)
{
return x.dis>y.dis;
}
}p[N];
struct ent{
int twd;
int lst;
int vls;
bool use;
}e[N<<];
std::priority_queue<pnt>Q;
/*class priority_queue{
public:
void push(pnt x)
{
line[++siz]=x;
int nw=siz;
while((nw>>1))
{
int nx=nw>>1;
if(line[nx].dis<line[nw].dis)
break;
std::swap(line[nw],line[nx]);
nw=nx;
}
return ;
}
void pop(void)
{
line[1]=line[siz--];
int nw=1;
while((nw<<1)<=siz)
{
int nx=nw<<1;
if(nx<siz&&line[nx].dis>line[nx+1].dis)
nx++;
if(line[nw].dis<line[nx].dis)
break;
std::swap(line[nw],line[nx]);
nw=nx;
}
return ;
}
int top(void)
{
return line[1].no;
}
bool empty(void)
{
return siz==0;
}
private:
pnt line[N];
int siz;
}Q;*/
int n,m;
int cnt;
int dfn;
void ade(int f,int t,int v)
{
cnt++;
e[cnt].twd=t;
e[cnt].lst=p[f].hd;
e[cnt].vls=v;
p[f].hd=cnt;
return ;
}
void Dij(int x)
{
for(int i=;i<=n;i++)
{
p[i].no=i;
p[i].dis=0x3f3f3f3f;
}
p[].dis=;
p[].fa=;
Q.push(p[x]);
while(!Q.empty())
{
x=Q.top().no;
Q.pop();
if(p[x].vis)
continue;
p[x].vis=true;
for(int i=p[x].hd;i;i=e[i].lst)
{
int to=e[i].twd;
if(p[to].dis>p[x].dis+e[i].vls)
{
p[to].fa=x;
p[to].dis=p[x].dis+e[i].vls;
Q.push(p[to]);
}
}
}
return ;
}
void Basic_dfs(int x,int f)
{
p[x].dp=p[f].dp+;
p[x].wgt=;
int maxs=-;
for(int i=p[x].hd;i;i=e[i].lst)
{
int to=e[i].twd;
if(p[to].fa!=x||to==f)
{
e[i].use=true;
continue;
}
Basic_dfs(to,x);
p[x].wgt+=p[to].wgt;
if(maxs<p[to].wgt)
{
p[x].mxs=to;
maxs=p[to].wgt;
}
}
return ;
}
void Build_dfs(int x,int top)
{
if(!x)
return ;
p[x].tp=top;
p[x].ind=++dfn;
Build_dfs(p[x].mxs,top);
for(int i=p[x].hd;i;i=e[i].lst)
{
int to=e[i].twd;
if(p[to].fa!=x||p[to].ind)
continue;
Build_dfs(to,to);
}
return ;
}
int Lca(int x,int y)
{
while(p[x].tp!=p[y].tp)
{
if(p[p[x].tp].dp<p[p[y].tp].dp)
std::swap(x,y);
x=p[p[x].tp].fa;
}
if(p[x].dp>p[y].dp)
std::swap(x,y);
return x;
}
void update(int l,int r,int ll,int rr,int spc,int v)
{
if(l>rr||ll>r)
return ;
if(ll<=l&&r<=rr)
{
tr[spc]=std::min(tr[spc],v);
return ;
}
int mid=(l+r)>>;
update(l,mid,ll,rr,spc<<,v);
update(mid+,r,ll,rr,spc<<|,v);
return ;
}
int query(int l,int r,int pos,int spc)
{
if(l==r)
return tr[spc];
int ans=tr[spc];
int mid=(l+r)>>;
if(pos<=mid)
return std::min(query(l,mid,pos,spc<<),ans);
else
return std::min(query(mid+,r,pos,spc<<|),ans);
}
int main()
{
memset(tr,0x6f,sizeof(tr));
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
ade(a,b,c);
ade(b,a,c);
}
Dij();
Basic_dfs(,);
Build_dfs(,);
for(int i=;i<=cnt;i+=)
{
int x,y;
x=e[i].twd;
y=e[i+].twd;
int val=e[i].vls+p[x].dis+p[y].dis;
int z=Lca(x,y);
if(e[i].use)
{
while(p[x].tp!=p[z].tp)
{
update(,dfn,p[p[x].tp].ind,p[x].ind,,val);
x=p[p[x].tp].fa;
}
if(x!=z)
update(,dfn,p[z].ind+,p[x].ind,,val);
}
if(e[i+].use)
{
while(p[y].tp!=p[z].tp)
{
update(,dfn,p[p[y].tp].ind,p[y].ind,,val);
y=p[p[y].tp].fa;
}
if(y!=z)
update(,dfn,p[z].ind+,p[y].ind,,val);
}
}
for(int i=;i<=n;i++)
{
int ans=0x3f3f3f3f;
ans=std::min(ans,query(,dfn,p[i].ind,)-p[i].dis);
if(ans==0x3f3f3f3f)
ans=-;
printf("%d\n",ans);
}
return ;
}
BZOJ1576: [Usaco2009 Jan]安全路经Travel(树链剖分)的更多相关文章
- bzoj 1576: [Usaco2009 Jan]安全路经Travel 树链剖分
1576: [Usaco2009 Jan]安全路经Travel Time Limit: 10 Sec Memory Limit: 64 MB Submit: 665 Solved: 227[Sub ...
- 【思维题 并查集 图论】bzoj1576: [Usaco2009 Jan]安全路经Travel
有趣的思考题 Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, b_i,和t_i Output * 第1..N-1行: 第 ...
- [BZOJ1576] [Usaco2009 Jan]安全路经Travel(堆优化dijk + (并查集 || 树剖))
传送门 蒟蒻我原本还想着跑两边spfa,发现不行,就gg了. 首先这道题卡spfa,所以需要用堆优化的dijkstra求出最短路径 因为题目中说了,保证最短路径有且只有一条,所以可以通过dfs求出最短 ...
- BZOJ1576 [Usaco2009 Jan]安全路经Travel
首先用Dijkstra做出最短路生成树,设dis[p]为1到p点的最短路长度 对于一条不在生成树上的边u -> v,不妨设fa为u.v的lca 则一fa到v的路径上的任意点x都可以由u达到,走的 ...
- BZOJ1576: [Usaco2009 Jan]安全路经Travel(最短路 并查集)
题意 给你一张无向图,保证从1号点到每个点的最短路唯一.对于每个点求出删掉号点到它的最短路上的最后一条边(就是这条路径上与他自己相连的那条边)后1号点到它的最短路的长度 Sol emmm,考场上想了个 ...
- 【BZOJ1576】[Usaco2009 Jan]安全路经Travel 最短路+并查集
[BZOJ1576][Usaco2009 Jan]安全路经Travel Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, ...
- [BZOJ1576] [BZOJ3694] [USACO2009Jan] 安全路径(最短路径+树链剖分)
[BZOJ1576] [BZOJ3694] [USACO2009Jan] 安全路径(最短路径+树链剖分) 题面 BZOJ1576和BZOJ3694几乎一模一样,只是BZOJ3694直接给出了最短路树 ...
- bzoj 1576 [Usaco2009 Jan]安全路经Travel(树链剖分,线段树)
[题意] 给定一个无向图,找到1-i所有的次短路经,要求与最短路径的最后一条边不重叠. [思路] 首先用dijkstra算法构造以1为根的最短路树. 将一条无向边看作两条有向边,考察一条不在最短路树上 ...
- [BZOJ 1576] [Usaco2009 Jan] 安全路经Travel 【树链剖分】
题目链接: BZOJ - 1576 题目分析 首先Orz Hzwer的题解. 先使用 dijikstra 求出最短路径树. 那么对于一条不在最短路径树上的边 (u -> v, w) 我们可以先沿 ...
随机推荐
- Android插件实例——360 DroidPlugin具体解释
在中国找到钱不难,但你的一个点子不意味着是一个创业.你谈一个再好的想法,比方我今天谈一个创意说,新浪为什么不收购GOOGLE呢?这个创意非常好.新浪一收购GOOGLE.是不是新浪就变成老大了?你从哪儿 ...
- android系统又一次刷ROM简记(一)
当须要对android系统进行大刀阔斧的改造的时候,应该清晰的了解android各个image的组成才干做到庖丁解牛. 首先在android烧写过程中须要烧写的文件主要包含uboot.bin\boot ...
- iOS 7 UI 过渡指南 - 支持续 iOS 6(iOS 7 UI Transition Guide - Supporting iOS 6)
iOS 7 UI Transition Guide Preparing for Transition Before You Start Scoping the Project Supporting i ...
- CO-PRIME(初探 莫比乌斯)NYOJ1066(经典)gcd(a,b)=1
CO-PRIME 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 This problem is so easy! Can you solve it? You are ...
- mybatis :与Spring MVC 的集成
用mybatis与Spring mvc 的方式集成起来,源码在本文结尾处下载.主要有以下几个方面的配置1. web.xml 配置 spring dispatchservlet ,比如为:mvc-dis ...
- 浅谈 C 语言中模块化设计的范式
今天继续谈模块化的问题.这个想慢慢写成个系列,但是不一定连续写.基本是想起来了,就整理点思路出来.主要还是为以后集中整理做点铺垫. 我们都知道,层次分明的代码最容易维护.你可以轻易的换掉某个层次上的某 ...
- 微信公众号开发(二)获取AccessToken、jsapi_ticket
Access Token 在微信公众平台接口开发中,Access Token占据了一个很重要的地位,相当于进入各种接口的钥匙,拿到这个钥匙才有调用其他各种特殊接口的权限. access_token是公 ...
- Network Stack : HTTP Cache
HTTP Cache 目录 1 Operation 2 Sparse Entries 3 Truncated Entries 4 Byte-Range Requests 5 HttpCache::Tr ...
- Cisco交换机IOS配置介绍
一.模式• 用户模式(>):• 特权模式(#):• 全局配置模式(config#):• 接口配置模式(config-if#):• 线路模式(#config-line): 二.基本IOS命令结构• ...
- Flex之文件目录浏览器实例
Flex之文件目录浏览器实例 Flex的AIR项目 <?xml version="1.0" encoding="utf-8"?> <mx:Wi ...