当前位置:网站首页>【2022杭电多校5 1003 Slipper】多个超级源点+最短路
【2022杭电多校5 1003 Slipper】多个超级源点+最短路
2022-08-04 20:44:00 【宇智波一打七~】
题目描述
输入
输出
样例输入
1
6
6 1 2
3 5 2
2 4 6
5 2 2
5 6 20
3 8
6 5
样例输出
12
题意
一棵树,每条边上有权值,然后可以以p的代价传送到距离当前节点k层的任意节点,p是输入给出的,现在给你一个起点和一个终点,问从起点到终点的最短花费是多少。
思路
除了能传送这个条件其他就是一个最短路,如果相距k层的每个点都都建一条边的话那么边就太多了,然后就可以想到在每一层建一个超级源点,这个超级源点距离这一层的点的距离是0,与距离这一层为k的超级源点的距离是p,然后wa掉了,因为只建立一个超级源点的话就会使得同一层的任意两个点的距离变成0,这是不成立的,然后就可以每一层建两个超级源点,一个进,一个出,这样问题就迎刃而解了,先来看一下这个样例图吧,每一层的蓝色点就是出点,红色点就是入点。下面看代码吧:
#include<bits/stdc++.h>
using namespace std;
const int N = 5e6+10;
typedef long long LL;
int h[N],e[N+N],ne[N+N];
int w[N+N],idx;
void add(int a,int b,int c){
e[idx] = b;
w[idx] = c;
ne[idx] = h[a];
h[a] = idx++;
}
vector<int> de[N];
int n,k,p;
LL dis[N];
bool st[N];
int mx;
void dfs(int u,int fa,int deep){
de[deep].push_back(u);
mx = max(mx,deep);
for(int i=h[u];i!=-1;i=ne[i]){
int v = e[i];
if(v == fa) continue;
dfs(v,u,deep+1);
}
}
typedef pair<LL,int> PII;
void solve(){
scanf("%d",&n);
idx = 0;
mx = 0;
for(int i=1;i<=4*n;i++){
h[i] = -1;
dis[i] = 0x3f3f3f3f3f3f3f3fll;
de[i].clear();
st[i] = false;
}
for(int i=1;i<n;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
scanf("%d%d",&k,&p);
dfs(1,0,1);
for(int i=1;i<=mx;i++){
for(auto u : de[i]){
add(u,n+i*2-1,0);
add(i*2+n,u,0);
}
if(i+k>mx) continue;
add(n+i*2-1,n+(i+k)*2,p);
add(n+(i+k)*2-1,n+i*2,p);
}
int sta,ed;
scanf("%d%d",&sta,&ed);
priority_queue<PII,vector<PII>,greater<PII> > q;
dis[sta] = 0;
q.push(make_pair(0,sta));
while(q.size()){
int t = q.top().second;
q.pop();
if(st[t]) continue;
if(t == ed) break;
st[t] = true;
for(int i=h[t];i!=-1;i=ne[i]){
int j = e[i];
if(dis[j] > dis[t] + w[i]){
dis[j] = dis[t] + w[i];
if(!st[j]) q.push({
dis[j],j});
}
}
}
printf("%lld\n",dis[ed]);
}
int main(){
int _;
scanf("%d",&_);
while(_--) solve();
return 0;
}
边栏推荐
猜你喜欢
面试官:索引为什么会失效?
Oreo域名授权验证系统v1.0.6公益开源版本网站源码
WIN10系统如何开启终端
简单理解 JS 事件循环
How to carry out AI business diagnosis and quickly identify growth points for cost reduction and efficiency improvement?
ADB 安装 + 打驱动全教程
vscode离线安装插件方法
格密码入门
After the tester with 10 years of service "naked resignation" from the big factory...
推荐系统_刘老师
随机推荐
二叉搜索树解决硬木问题
Web3安全风险令人生畏,应该如何应对?
某男子因用本地虚拟机做压测,惨遭字节面试官当场嘲笑
使用 Chrome 开发者工具 coverage 功能分析 web 应用的渲染阻止资源的执行分布情况
[AGC] Build Service 1 - Cloud Function Example
ASP.NET商贸进销存管理系统源码(带数据库文档)源码免费分享
mysql的存储过程介绍、创建、案例、删除、查看「建议收藏」
知识分享|如何设计有效的帮助中心,不妨来看看以下几点
2022-8-4 第七组 ptz 锁与线程池和工具类
暴雨中的人
刷题-洛谷-P1179 数字统计
Desthiobiotin衍生物Desthiobiotin-PEG4-Amine/Alkyne/Azide/DBCO
大资本已开始逃离加密领域?
五分钟入门文本处理三剑客grep awk sed
Five Minutes Introductory Text Processing Three Musketeers grep awk sed
后缀式的计算
Matlab画图2
关于 SAP 电商云 Spartacus UI SSR 的 state transfer 问题
idea2021版本添加上一步和下一步操作到工具栏
Zero-knowledge proof - zkSNARK proof system