#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, M = 2e5 + 10;
#define LL long long
struct Node{
int to, w;
bool operator<(const Node &a)const{
return w > a.w;
}
};
int n, m, s, dis[N];
vector<Node>edges[N];
bool flag[N];
priority_queue<Node>q;
void Dijkstra(){
for(int i = 0; i <= n; i++) dis[i] = INT_MAX;
dis[s] = 0;
q.push({s, 0});
while(q.size()){
int u = q.top().to;
q.pop();
if(flag[u]) continue;
flag[u] = true;
for(int i = 0; i < edges[u].size(); i++){
int v = edges[u][i].to, w = edges[u][i].w;
if(dis[u] + w < dis[v]){
dis[v] = dis[u] + w;
q.push({v, dis[v]});
}
}
}
for(int i = 1; i <= n; i++){
cout << dis[i] << " ";
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> s;
for(int i = 1; i <= m; i++){
int u, v, w;
cin >> u >> v >> w;
edges[u].push_back({v, w});
}
Dijkstra();
return 0;
}
上面这一篇是AC code 但与下面这一个只T一个点的code只差一行
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, M = 2e5 + 10;
#define LL long long
struct Node{
int to, w;
bool operator<(const Node &a)const{
return w > a.w;
}
};
int n, m, s, dis[N];
vector<Node>edges[N];
bool flag[N];
priority_queue<Node>q;
void Dijkstra(){
for(int i = 0; i <= n; i++) dis[i] = INT_MAX;
dis[s] = 0;
q.push({s, 0});
while(q.size()){
int u = q.top().to;
q.pop();
flag[u] = true;
for(int i = 0; i < edges[u].size(); i++){
int v = edges[u][i].to, w = edges[u][i].w;
if(!flag[v] && dis[u] + w < dis[v]){
dis[v] = dis[u] + w;
q.push({v, dis[v]});
}
}
}
for(int i = 1; i <= n; i++){
cout << dis[i] << " ";
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> s;
for(int i = 1; i <= m; i++){
int u, v, w;
cin >> u >> v >> w;
edges[u].push_back({v, w});
}
Dijkstra();
return 0;
}
也就是第一篇的26行和第二篇的29行 为什么flag数组的标记位置会有影响 按道理来说其实没有flag数组也没有影响吗 毕竟标记过后应该是保证最优解的啊 求dalao可以解惑 悬赏一个关注