kxr_ @ 2023-03-13 22:08:45
#include<bits/stdc++.h>
//#include<queue> //priority_queue<pair<int,int> >q需要
using namespace std;
const int N=1e5+1000,M=2e5+1000,INF=0x3f3f3f3f;
int n,m,tot,st;
int dis[N];
int first[N],nex[M],to[M],w[M];
bool vis[N];
priority_queue<pair<int,int> >q;
void add(int x,int y,int z){
nex[++tot]=first[x];
first[x]=tot;
to[tot]=y;
w[tot]=z;
}
void dijstra(){
memset(dis,INF,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[st]=0;
q.push(make_pair(0,st));
while(!q.empty()){
int u=q.top().second;
q.pop();
if(vis[u]){
continue;
}
vis[u]=1;
for(int e=first[u];e;e=nex[e]){
int v=to[e];
if(dis[u]+w[e]<dis[v]){
dis[v]=dis[u]+w[e];
q.push(make_pair(-dis[v],v));
}
}
}
}
int main(){
cin>>n>>m>>st;
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
dijstra();
for(int i=1;i<=n;i++){
cout<<dis[i]<<" ";
}
return 0;
}
by Loic_ @ 2023-03-13 22:14:26
为何反向加边?
如果真要加那么请开两倍数组。
by 2949767807qwer @ 2023-03-13 22:29:02
给定一个
m$ 条有向边的带非负权图,请你计算从
s$ 出发到任意点。
by RP_INT_MAX @ 2023-03-13 22:50:21
@kxr_ 有向边捏。
by kxr_ @ 2023-03-14 21:23:28
@Loic_@2949767807qwer@RP_INT_MAX 谢谢大佬提醒,AC了