USACO JAN 09

news/2024/12/26 19:30:17/文章来源:https://www.cnblogs.com/Glowingfire/p/18634060

[USACO09JAN] Safe Travel G

题面翻译

【题目描述】

给定一张有 \(n\) 个节点,\(m\) 条边的无向图,对于任意的 \(i\)\(2\le i\le n\)),请求出在不经过原来 \(1\) 节点到 \(i\) 节点最短路上最后一条边的前提下,\(1\) 节点到 \(i\) 节点的最短路。

特别地,保证 \(1\) 到任何一个点 \(i\) 的最短路都是唯一的。

保证图中没有重边和自环。

【输入格式】

第一行,两个整数 \(n,m\)

之后 \(m\) 行,每行三个整数 \(a_i,b_i,t_i\) 表示有一条 \(a_i\)\(b_i\),边权为 \(t_i\) 的无向边。

【输出格式】

\(n-1\) 行,第 \(i\) 行表示 \(1\)\(i+1\) 在不经过原来 \(1\) 节点到 \(i+1\) 节点最短路上最后一条边的前提下的最短路。如果最短路不存在,则在对应行输出 -1

翻译贡献者:@cryozwq。

题目描述

Gremlins have infested the farm. These nasty, ugly fairy-like

creatures thwart the cows as each one walks from the barn (conveniently located at pasture_1) to the other fields, with cow_i traveling to from pasture_1 to pasture_i. Each gremlin is personalized and knows the quickest path that cow_i normally takes to pasture_i. Gremlin_i waits for cow_i in the middle of the final cowpath of the quickest route to pasture_i, hoping to harass cow_i.

Each of the cows, of course, wishes not to be harassed and thus chooses an at least slightly different route from pasture_1 (the barn) to pasture_i.

Compute the best time to traverse each of these new not-quite-quickest routes that enable each cow_i that avoid gremlin_i who is located on the final cowpath of the quickest route from pasture_1 to

pasture_i.

As usual, the M (2 <= M <= 200,000) cowpaths conveniently numbered 1..M are bidirectional and enable travel to all N (3 <= N <= 100,000) pastures conveniently numbered 1..N. Cowpath i connects pastures a_i (1 <= a_i <= N) and b_i (1 <= b_i <= N) and requires t_i (1 <= t_i <= 1,000) time to traverse. No two cowpaths connect the same two pastures, and no path connects a pasture to itself (a_i != b_i). Best of all, the shortest path regularly taken by cow_i from pasture_1 to pasture_i is unique in all the test data supplied to your program.

By way of example, consider these pastures, cowpaths, and [times]:

1--[2]--2-------+ 
|       |       | 
[2]     [1]     [3] 
|       |       | 
+-------3--[4]--4
TRAVEL     BEST ROUTE   BEST TIME   LAST PATH 
p_1 to p_2       1->2          2         1->2 
p_1 to p_3       1->3          2         1->3 
p_1 to p_4      1->2->4        5         2->4 

When gremlins are present:

TRAVEL     BEST ROUTE   BEST TIME    AVOID 
p_1 to p_2     1->3->2         3         1->2 
p_1 to p_3     1->2->3         3         1->3 
p_1 to p_4     1->3->4         6         2->4 

For 20% of the test data, N <= 200.

For 50% of the test data, N <= 3000.

TIME LIMIT: 3 Seconds

MEMORY LIMIT: 64 MB

输入格式

* Line 1: Two space-separated integers: N and M

* Lines 2..M+1: Three space-separated integers: a_i, b_i, and t_i

输出格式

* Lines 1..N-1: Line i contains the smallest time required to travel from pasture_1 to pasture_i+1 while avoiding the final cowpath of the shortest path from pasture_1 to pasture_i+1. If no such path exists from pasture_1 to pasture_i+1, output -1 alone on the line.

样例 #1

样例输入 #1

4 5 
1 2 2 
1 3 2 
3 4 4 
3 2 1 
2 4 3

样例输出 #1

3 
3 
6

提示

感谢 karlven 提供翻译。


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+100;
const ll INF=1e12;
struct edge
{int x,y,n;ll z;bool operator < (const edge &a) const{return z>a.z;}
}e[N<<1];
struct segtree
{struct node{int lc,rc,val;}s[N<<6];int tot;void upd(int &i,ll l,ll r,ll x,int z){if(!i)i=++tot;s[i].val+=z;if(l==r)return ;ll mid=(l+r)>>1;if(x<=mid)upd(s[i].lc,l,mid,x,z);elseupd(s[i].rc,mid+1,r,x,z);}void merg(int &i,int &j,ll l,ll r)//i <-- j{if(i==0 || j==0){i+=j;return ;}if(l==r){s[i].val+=s[j].val;return ;}ll mid=(l+r)>>1;merg(s[i].lc,s[j].lc,l,mid);merg(s[i].rc,s[j].rc,mid+1,r);s[i].val= s[ s[i].lc ].val + s[ s[i].rc ].val;}ll que(int i,ll l,ll r){if(i==0)return 0;if(l==r)return l;ll sum=0;ll mid=(l+r)>>1;if(s[ s[i].lc ].val >0)sum=que(s[i].lc,l,mid);elsesum=que(s[i].rc,mid+1,r);return sum;}
}T;priority_queue<edge ,vector<edge> >q;
vector<int >son[N];
int n,m,head[N],cnt=1,dfn;
int deg[N],vis[N],pre[N],h[N];
int f[N][21],dep[N],root[N],st[N];
ll dis[N],ans[N];
void ad(int x,int y,ll z)
{e[++cnt].n=head[x];e[cnt].y=y;e[cnt].z=z;e[cnt].x=x;head[x]=cnt;
}void init();
void loading();
void work();
void print();
int main()
{init();loading();work();return 0;
}
edge emp;
edge made(int y,ll z)
{emp.y=y;emp.z=z;return emp;
}void dijk()
{++dfn;for(int i=1;i<=n;++i){dis[i]=INF;ans[i]=-1;st[i]=i;}dis[1]=0;q.push( made(1,0) );while(!q.empty()){edge nw=q.top();q.pop();int u=nw.y;if(vis[u]==dfn)continue;vis[u]=dfn;for(int i=head[u],v;i;i=e[i].n){v=e[i].y;if(dis[v]>dis[u]+e[i].z){pre[v]=u;dis[v]=dis[u]+e[i].z;q.push( made(v,dis[v]) );}}}
}void init()
{freopen("travel.in","r",stdin);freopen("travel.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1,x,y;i<=m;++i){ll z;scanf("%d%d%lld",&x,&y,&z);ad(x,y,z);ad(y,x,z);}}int fin(int x)
{return (st[x]==x)?(x):(st[x]=fin(st[x]));
}void go(int u)
{int he=1,ta=0;while(vis[u]<dfn){h[++ta]=u;u=pre[u];}for(int i=ta,fa,x,fx,fy;i>=1;--i){// h[i] --> h[i-1]x=h[i];fa=pre[ x ];fx=fin(x);fy=fin(fa);if(fx!=fy)st[fx]=fy;vis[ x ]=dfn;f[x][0]=fa;dep[x]=dep[fa]+1;++deg[ fa ];son[ fa ].push_back(x);for(int j=1;j<=19;++j)f[x][j]= f[ f[x][j-1] ][j-1];}
}int lca(int x,int y)
{if(x==y)return x;if(dep[x]<dep[y])swap(x,y);for(int i=19;i>=0;--i)if(dep[ f[x][i] ]>dep[y])x=f[x][i];if(dep[x]!=dep[y])x=f[x][0];if(x==y)return x;for(int i=19;i>=0;--i)if(f[x][i] != f[y][i]){x=f[x][i];y=f[y][i];}return f[x][0];
}void loading()
{dijk();++dfn;vis[1]=dfn;for(int i=2;i<=n;++i)if(vis[i]<dfn)go(i);
}void gotans(int u)
{for(int i=0,v;i<deg[u];++i){v=son[u][i];gotans(v);T.merg(root[u],root[v],1ll,INF);}ans[u]=T.que(root[u],1ll,INF)-dis[u];
}void work()
{for(int i=2,x,y,z,lc;i<=cnt;++i){x=e[i].x;y=e[i].y;z=e[i].z;if(f[x][0]==y || f[y][0]==x || ( fin(st[x])!=1 ) || ( fin(st[y])!=1 ) )continue;lc=lca(x,y);//dis[x] + dis[y] +zint val=dis[x] + dis[y] +z;T.upd(root[x],1ll,INF,val,1);T.upd(root[y],1ll,INF,val,1);T.upd(root[lc],1ll,INF,val,-2);}gotans(1);print();
}void print()
{for(int i=2;i<=n;++i){printf("%d\n",(ans[i]<0)?(-1):(ans[i]));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/859406.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis可视化工具推荐:Another Redis Desktop Manager使用教程与下载

Redis是一种高性能的Key-Value数据库,被广泛应用于缓存、消息队列等场景。尽管Redis的命令行工具功能强大,但对于许多开发者而言,使用一款可视化工具可以大大提高操作效率和用户体验。今天为大家推荐一款功能强大的Redis可视化工具——Another Redis Desktop Manager,并提供…

RISC-V篇-VSCode+qemu+gdb可视化调试Linux Kernel

https://zhuanlan.zhihu.com/p/4185359719本文发布于微信公众号:Linux底层小工,欢迎关注,获取更多原创技术文章! “VSCode+qemu+gdb调试OpenSBI确实很爽,那怎能少了调试kernel呢~~” 01 VScode调试MMU开启之前的kernel 有了调试OpenSBI的基础,再调试kernel,那设置相当简…

中考阅读理解深入逻辑分析-006 A Streams Journey to the Sea 一条小溪通往大海的旅程

文章正文 A little stream ran down from a high mountain far, far away through many villages and forests, until it reached a desert. The stream then thought,“I’ve been through countless difficulties. I should have no problem crossing the desert!”But as sh…

2024-2025-1 20241322 《计算机基础与程序设计》第十四周学习总结

2024-2025-1 20241322 《计算机基础与程序设计》第十四周学习总结 作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标 自学教材《C语言程序设计》…

Chrome 或引入 Gemini AI 功能「Glic」,需访问麦克风;理想同学 App 即将上线支持语音交流、识物

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

洛谷题单指南-线段树的进阶用法-P3834 【模板】可持久化线段树 2

原题链接:https://www.luogu.com.cn/problem/P3834 题意解读:静态区间第k小问题,可持久化线段树(也称为主席树)模版题。 解题思路: 一、朴素想法:如何求完整区间[1,n]第k小 1、权值线段树 设n个数构成序列a,b数组代表a中元素出现的次数,即b数组的构建方式为对每一个a[…

FTP一键安装脚本(linux版)

简述:linux版权限可能会不容易理解,可参考windwos做为基础。一、FTP(linux版) 1. ftp详解 简介: vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。 vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、…

React—01—基本学习,如何在html中直接使用react;

一、react的特点:<script>标签这里要加一个“text/babel”,babel才知道这个<script>标签里要解析js代码,否则babel不会启动。 React 组件是返回标签的 JavaScript 函数:哪个组件是通过改变 state 实现可响应的,或者哪个组件拥有 这个 state。 然后我们需要确定…

记录python+pyside+qml+qtcharts 使用,防踩坑

使用QML-qtquick 进行开发时,有个使用chart图表的需求,看了一大圈,网上都是qmake或是cmake来构建QTchart,用python开发也只搜到QtWidgets模块进行图表绘制。然而我对qtwidgets不是很了解,想要的是QML开发,在使用ChartView{}时一直闪退,没有效果。经历了苦苦搜寻,终于在 h…

制作了一款 pdf 转换图片的工具( csharp 版 )

在 Windsurf 的帮助下,制作了一款 windows 下的 pdf 转换图片(png/jpg/tif)工具。支持递归查找 pdf,一些配置给写死了,适合简单使用。 PDF 批量转图片工具 这是一个功能强大且易用的 PDF 转图片工具,专为批量处理 PDF 文件设计。它能够将 PDF 文件的每一页转换为高质量的…

C# WPF PrintDialog 打印(1)

参考“WPF 打印实例”的文章:https://www.cnblogs.com/gnielee/archive/2010/07/02/wpf-print-sample.html 测试程序: 首先打印Canvas效果:看起来似乎没问题,但是调整窗体尺寸遮挡部分元素:再打印Canvas效果:可以发现PrintVisual方法只打印了可见部分的元素,测试打印Dat…

CentOS8安装

安装方法跟Centos7无差异。 一、下载安装包镜像地址:https://mirrors.aliyun.com/centos-vault/centos/8.2.2004/isos/x86_64/?spm=a2c6h.25603864.0.0.1f647af6cvFFgO 二、安装操作系统 安装界面如下, 三、后续工作a、配置ip地址 [root@localhost ~]# cat /etc/sysconfi…