一、算法实现
二、代码实现
#include<cstdio>
#include<cstring>
#include <queue>
const int sizeM = 500005;
const int sizeN = 10005;
using namespace std;
int n,m,s,cnt;
int head[sizeN],dis[sizeN],vis[sizeN];
struct Edge{
int next;
int to;
int weight;
}edges[sizeM];
struct Node{
int vertex;
int weight;
Node(){};
Node (int vertex, int weight){
this->vertex = vertex;
this->weight = weight;
}
bool operator < (const Node & a) const{
return weight > a.weight;
}
};
bool cmp(Node n1, Node n2){
return n1.weight > n2.weight;
}
void add(int from, int to, int weight){
edges[++cnt].to = to;
edges[cnt].weight = weight;
edges[cnt].next = head[from];
head[from] = cnt;
}
int read(){
int f = 1, ans = 0;
char c = getchar();
while(c <'0' || c>'9'){
if(c == '-'){
f = -1;
}
c = getchar();
}
while(c >= '0' && c <= '9'){
ans = ans*10+c-'0';
c= getchar();
}
return f*ans;
}
int main() {
int from,to,weight;
memset(head,-1,sizeof(head));
memset(dis,0x3f,sizeof(dis));
n = read(); m = read(); s = read();
for(int i = 1; i <= m; i ++){
from = read(); to = read(); weight = read();
add(from,to,weight);
}
priority_queue<Node> q;
dis[s] = 0;
q.push(Node(s,0));
while(!q.empty()){
Node node = q.top();
q.pop();
int vertex = node.vertex;
if(vis[vertex]){
continue;
}
vis[vertex] = 1;
for(int i = head[vertex]; i != -1; i = edges[i].next){
int v = edges[i].to, w = edges[i].weight;
if(!vis[v] && dis[v] > dis[vertex]+w){
dis[v] = dis[vertex]+w;
q.push(Node(v,dis[v]));
}
}
}
for(int i = 1; i <= n; i ++){
printf("%d ", dis[i]);
}
printf("\n");
return 0;
}