BZOJ_1576_[Usaco2009 Jan]安全路经Travel&&BZOJ_3694_最短路_树链剖分+线段树
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
3
6
3694只是给出最短路树而已,这里考虑1576怎么做。
首先求出最短路树。
设第i个点到根的路径长度为dis[i]。
考虑每条非树边<u,v>,有哪些牛牛可以经过这条边呢?
设l=lca(u,v),只有u到l和l到v路径上的点对应的牛才能享受到这条边。
考虑在子树内部的情况:最后一条边被割断因此走这条边不会减少到该点的距离。
考虑在外面的情况:由于到祖先的边被割断根本走不到u或v。
所以就变成了一个路径赋值取min,单点查询的问题。
树剖+线段树即可。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <ext/pb_ds/priority_queue.hpp>
using namespace std;
using namespace __gnu_pbds;
#define N 200050
#define M 200050
#define inf 0x3f3f3f3f
#define ls p<<1
#define rs p<<1|1
vector<int>v[N];
vector<int>w[N];
int head[N],to[M<<1],nxt[M<<1],val[M<<1],cnt=1,n,m,xx[M],yy[M],zz[M],vis[M],use[M],t[N<<2],cov[N<<2],dis[N];
int dep[N],fa[N],top[N],son[N],siz[N],idx[N],turn[M<<1],ww[M<<1];
__gnu_pbds::priority_queue<pair<int,int> >q;
struct shulianpoufen {
int head[N],to[N<<1],nxt[N<<1],cnt; }T;
inline void add(int u,int v,int w) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; val[cnt]=w;
}
void dij() {
memset(dis,0x3f,sizeof(dis));
dis[1]=0; q.push(make_pair(0,1));
while(!q.empty()) {
int x=q.top().second,i; q.pop();
if(vis[x]) continue;
vis[x]=1;
for(i=head[x];i;i=nxt[i]) {
if(dis[to[i]]+val[i]==dis[x]) {
// printf("%d %d\n",x,to[i]);
v[x].push_back(to[i]); w[x].push_back(val[i]);
v[to[i]].push_back(x); w[to[i]].push_back(val[i]);
use[i>>1]=1;
}
}
for(i=head[x];i;i=nxt[i]) {
if(dis[to[i]]>dis[x]+val[i]) {
dis[to[i]]=dis[x]+val[i];
q.push(make_pair(-dis[to[i]],to[i]));
}
}
}
}
void dfs1(int x,int y) {
fa[x]=y; dep[x]=dep[y]+1; siz[x]=1;
int i;
for(i=head[x];i;i=nxt[i]) {
if(to[i]!=y) {
dis[to[i]]=dis[x]+val[i];
dfs1(to[i],x);
siz[x]+=siz[to[i]]; if(siz[to[i]]>siz[son[x]]) son[x]=to[i];
}
}
}
void dfs2(int x,int t) {
int i; top[x]=t; idx[x]=++idx[0];
if(son[x]) dfs2(son[x],t);
for(i=head[x];i;i=nxt[i]) {
if(to[i]!=fa[x]&&to[i]!=son[x]) dfs2(to[i],to[i]);
}
}
void pushdown(int p) {
if(cov[p]!=inf) {
int d=cov[p];
t[ls]=min(t[ls],d); t[rs]=min(t[rs],d);
cov[ls]=min(cov[ls],d); cov[rs]=min(cov[rs],d);
cov[p]=inf;
}
}
void update(int l,int r,int x,int y,int v,int p) {
if(x<=l&&y>=r) {
t[p]=min(t[p],v); cov[p]=min(cov[p],v); return ;
}
pushdown(p);
int mid=(l+r)>>1;
if(x<=mid) update(l,mid,x,y,v,ls);
if(y>mid) update(mid+1,r,x,y,v,rs);
t[p]=min(t[ls],t[rs]);
}
int query(int l,int r,int x,int p) {
if(l==r) return t[p];
pushdown(p);
int mid=(l+r)>>1;
if(x<=mid) return query(l,mid,x,ls);
else return query(mid+1,r,x,rs);
}
void solve() {
dfs1(1,1); dfs2(1,0);
memset(t,0x3f,sizeof(t));
memset(cov,0x3f,sizeof(cov));
int i;
for(i=1;i<=m;i++) {
if(!use[i]) {
int x=xx[i],y=yy[i],z=zz[i]+dis[x]+dis[y];
while(top[x]!=top[y]) {
if(dep[top[x]]>dep[top[y]]) swap(x,y);
update(1,n,idx[top[y]],idx[y],z,1);
y=fa[top[y]];
}
if(dep[x]<dep[y]) swap(x,y);
if(x!=y) update(1,n,idx[y]+1,idx[x],z,1);
}
}
for(i=2;i<=n;i++) {
int tmp=query(1,n,idx[i],1);
if(tmp==inf) puts("-1");
else {
printf("%d\n",tmp-dis[i]);
}
}
}
int main() {
scanf("%d%d",&n,&m);
int i,j;
for(i=1;i<=m;i++) {
scanf("%d%d%d",&xx[i],&yy[i],&zz[i]);
add(xx[i],yy[i],zz[i]); add(yy[i],xx[i],zz[i]);
}
dij();
memset(head,0,sizeof(head)); cnt=0;
for(i=1;i<=n;i++) {
for(j=0;j<v[i].size();j++) add(v[i][j],i,w[i][j]);
}
solve();
}
BZOJ_1576_[Usaco2009 Jan]安全路经Travel&&BZOJ_3694_最短路_树链剖分+线段树的更多相关文章
- hdu5893 List wants to travel(树链剖分+线段树)
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submissi ...
- [Usaco2009 Jan]安全路经Travel BZOJ1576 Dijkstra+树链剖分+线段树
分析: Dijkstra求最短路树,在最短路树上进行操作,详情可见上一篇博客:http://www.cnblogs.com/Winniechen/p/9042937.html 我觉得这个东西不压行写出 ...
- [BZOJ1576] [Usaco2009 Jan]安全路经Travel(堆优化dijk + (并查集 || 树剖))
传送门 蒟蒻我原本还想着跑两边spfa,发现不行,就gg了. 首先这道题卡spfa,所以需要用堆优化的dijkstra求出最短路径 因为题目中说了,保证最短路径有且只有一条,所以可以通过dfs求出最短 ...
- bzoj 1576: [Usaco2009 Jan]安全路经Travel【spfa+树链剖分+线段树】
这几天写USACO水题脑子锈住了--上来就贪心,一交就WA 事实上这个是一个叫最短路树的东西,因为能保证只有一条最短路,所以所有最短路合起来是一棵以1为根的树,并且在这棵树上,每个点被精灵占据的路是它 ...
- HDU 5893 List wants to travel(树链剖分+线段树)
题目链接 HDU5893 $2016$年$ICPC$沈阳网络赛的$B$题.这道题其和 BZOJ2243 基本一样 那道题我也写了题解 点这里 两道题的区别就是$BZOJ$这题是点的权值,这道题是边权. ...
- bzoj 1576 [Usaco2009 Jan]安全路经Travel(树链剖分,线段树)
[题意] 给定一个无向图,找到1-i所有的次短路经,要求与最短路径的最后一条边不重叠. [思路] 首先用dijkstra算法构造以1为根的最短路树. 将一条无向边看作两条有向边,考察一条不在最短路树上 ...
- 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 最短路+并查集
[BZOJ1576][Usaco2009 Jan]安全路经Travel Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, ...
- 【思维题 并查集 图论】bzoj1576: [Usaco2009 Jan]安全路经Travel
有趣的思考题 Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, b_i,和t_i Output * 第1..N-1行: 第 ...
随机推荐
- 基于Redis的三种分布式爬虫策略
前言: 爬虫是偏IO型的任务,分布式爬虫的实现难度比分布式计算和分布式存储简单得多. 个人以为分布式爬虫需要考虑的点主要有以下几个: 爬虫任务的统一调度 爬虫任务的统一去重 存储问题 速度问题 足够“ ...
- MySQL-----一对一
一对一: 用户表和博客表 用户表(userinfo): 用户id 用户名 1 George 2 root 3 Bruce 4 Catherine 博客表: 博客id 博客名 用户id(FK + 唯一) ...
- 集训第五周动态规划 C题 编辑距离
Description Let x and y be two strings over some finite alphabet A. We would like to transform x int ...
- Web页面测试总结(控件类)
界面测试,最多的就是各种控件的功能测试,只有掌握了其测试要点,了解测试方法,总结各种测试情景,才能熟练测试Web页面. 一.输入框 输入框分为文本输入框,数字输入框.一般使用在填写输入的内容上,比如名 ...
- 【51NOD1766】树上的最远点对(线段树,LCA,RMQ)
题意:n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间, 表示点的标号请你求出两个区间内各选一点之间的最大距离,即你需要求出max{dis(i,j) |a<=i<=b,c< ...
- 【BZOJ4474】isomorphism(树的同构,哈希)
题意:一个无向树的度数为 2的结点称为假结点,其它结点称为真结点.一个无向树的简化树其结点由原树的全体真结点组成,两个真结点之间有边当且仅当它们在原树中有边,或者在原树中有一条联结这两个结点的路,其中 ...
- Evaluate Reverse Polish Notation(逆波兰式)
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
- 洛谷 P4057 [Code+#1]晨跑
P4057 [Code+#1]晨跑 题目描述 “无体育,不清华”.“每天锻炼一小时,健康工作五十年,幸福生活一辈子” 在清华,体育运动绝对是同学们生活中不可或缺的一部分.为了响应学校的号召,模范好学生 ...
- Redis Cluster集群搭建后,客户端的连接研究(Spring/Jedis)(待实践)
说明:无论是否已经搭建好集群,还是使用什么样的客户端去连接,都是必须把全部IP列表集成进去,然后随机往其中一个IP写. 这样做的好处: 1.随机IP写入之后,Redis Cluster代理层会自动根据 ...
- ETL增量单表同步简述_根据timestamp增量
ETL增量单表同步简述 1. 实现需求 当原数据库的表有新增.更新.删除操作时,将改动数据同步到目标库对应的数据表. 2. 设计思路 设计总体流程图如下: 步骤简单说明: 1.设置job的执行属性,如 ...