当前位置:网站首页>【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;
}
边栏推荐
猜你喜欢
搭建MyCat2一主一从的MySQL读写分离
[Academic related] Tsinghua professor persuaded to quit his Ph.D.:I have seen too many doctoral students have mental breakdowns, mental imbalances, physical collapses, and nothing!...
【debug】postgres数据存储错乱
Comic | Two weeks after the boss laid me off, he hired me back and doubled my salary!
文章复现:超分辨率网络-VDSR
Zero-knowledge proof - zkSNARK proof system
零知识证明笔记——私密交易,pederson,区间证明,所有权证明
Tensorflow2 环境搭建
【Web漏洞探索】跨站脚本漏洞
c语言小项目(三子棋游戏实现)
随机推荐
idea2021版本添加上一步和下一步操作到工具栏
KubeSphere简介,功能介绍,优势,架构说明及应用场景
【TypeScript】深入学习TypeScript枚举
【AGC】构建服务1-云函数示例
Five Minutes Introductory Text Processing Three Musketeers grep awk sed
简述@RequestParam与@RequestBody参数注解
Desthiobiotin衍生物Desthiobiotin-PEG4-Amine/Alkyne/Azide/DBCO
Web3安全风险令人生畏,应该如何应对?
Zero-knowledge proof notes - private transaction, pederson, interval proof, proof of ownership
LINQ to SQL (Group By/Having/Count/Sum/Min/Max/Avg操作符)
链队
Latex分章节、分段落编译:input{}与include{}的区别
adb shell input keyevent 模拟按键事件
结构体小结
C语言小笔记+题
C#移动OA办公系统源码(基于微信企业号)
Win10 uwp use ScaleTransform magnify an element
uwp ScrollViewer content out of panel when set the long width
格密码入门
STP --- 生成树协议