ycy1124 @ 2024-06-27 08:17:53
#include<bits/stdc++.h>
using namespace std;
int ans[100001];
bool bj[100001];
int n,m,q,tot=0;
struct Node{
int to,w;
};
Node b[100001];
vector <Node> a[100001];
void work(int x){
if(x/2>=1&&b[x].w<b[x/2].w){
swap(b[x].w,b[x/2].w);
work(x/2);
}
}
void work1(int x){
if(b[x*2].w<b[x*2+1].w&&x*2+1<=tot&&b[x*2].w<b[x].w){
swap(b[x*2].w,b[x].w);
work1(x*2);
}
else if(x*2+1<=tot&&b[x*2+1].w<b[x].w){
swap(b[x*2+1],b[x]);
work1(x*2+1);
}
else if(x*2+1>tot&&x*2<=tot&&b[x*2].w<b[x].w){
swap(b[x*2],b[x]);
work1(x*2);
}
else{
return;
}
}
void bfs(int i,int js){
if(bj[i]){
return;
}
bj[i]=1;
ans[i]=js;
bj[i]=1;
for(auto it:a[i]){
if(!bj[it.to]){
b[++tot].w=it.w+js;
b[tot].to=it.to;
work(tot);
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
a[u].push_back({v,w});
}
b[++tot]={q,0};
while(tot!=0){
bfs(b[1].to,b[1].w);
swap(b[1],b[tot]);
tot--;
work1(1);
}
for(int i=1;i<=n;i++){
printf("%d ",ans[i]);
}
return 0;
}
by WJX120423 @ 2024-06-27 09:08:16
@ycy1124 敢问楼主用的什么方法
by Miracle_1024 @ 2024-06-27 09:15:37
@ycy1124
建议使用图论完成qwq
by Miracle_1024 @ 2024-06-27 09:16:11
@ycy1124
没看到你这个在干啥,一般都用图论做的
by Miracle_1024 @ 2024-06-27 09:16:29
@Miracle_1024
没看懂
by ycy1124 @ 2024-06-27 09:17:35
@WJX120423
应该是手写堆加Dijkstra,但我第一次写,不知道真正写出的是啥东西狗屎。
by ycy1124 @ 2024-06-27 09:18:45
@Miracle_1024
可能是我的堆写得太恶心了
by Miracle_1024 @ 2024-06-27 09:19:17
@ycy1124
直接dijkstra不香吗
by ycy1124 @ 2024-06-27 09:20:47
@Miracle_1024
不会优先队列
by WJX120423 @ 2024-06-27 09:21:03
@ycy1124 手写dijkstra不香吗
by Miracle_1024 @ 2024-06-27 09:21:43
@ycy1124
好像没有一定要优先队列