迪杰斯特拉

迪杰斯特拉算法就是每次寻找与与原点最近的点然后更新与它相连的点,要注意的是传入起始点时不需要标记它,因为需要它扩展到其他点,只有当一个点出队时才需要标记它,因为后入队的同一个点可能距离更小
#include<iostream>
#include<queue>
#include<vector>
#define int long long
using namespace std;
const int N=1e6;
struct node{
int id,dis;
};
priority_queue<node>q;
bool operator<(node n1,node n2){
return n1.dis>n2.dis;
}
vector<node>v[N];
int w[N];
int vis[N];
void bfs(int s){
q.push({s,0});
while(!q.empty()){
node x=q.top();
q.pop();
if(vis[x.id])continue;
vis[x.id]=1;
w[x.id]=x.dis;
for(int i=0;i<v[x.id].size();i++){
if(!vis[v[x.id][i].id]){
q.push({v[x.id][i].id,x.dis+v[x.id][i].dis});
//vis[v[x.id][i].id]=1;
}
}
}
}
signed main(){
int n,m,s;
cin>>n>>m>>s;
for(int i=1;i<=m;i++){
int U,V,K;
cin>>U>>V>>K;
v[U].push_back({V,K});
}
bfs(s);
for(int i=1;i<=n;i++)cout<<w[i]<<" ";
return 0;
}

浙公网安备 33010602011771号