#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 5;
int inf = 1e9 + 7;
vector<int> G[maxn],cost[maxn];
queue<int> seq;
int n,m,dis[maxn],vis[maxn];
void spfa(int x){
for(int i = 1;i <= n;i++) dis[i] = inf;
dis[x] = 0;
seq.push(x),vis[x] = 1;
while(!seq.empty()){
int u = seq.front();
for(int i = 0;i < G[u].size();i++){
int v = G[u][i];
if(dis[u] + cost[u][i] < dis[v]){
dis[v] = dis[u] + cost[u][i];//松弛点 v。
if(!vis[v]){//若被松弛的点不在队列里,就加入队列。
seq.push(v);
vis[v] = 1;
}
}
}
if(!seq.empty()) seq.pop(),vis[u] = 0;
}
}
int main(){
scanf("%d %d\n",&n,&m);//n个点,m条边。
for(int i = 1;i <= m;i++){
int x,y,w;
scanf("%d %d %d",&x,&y,&w);//点x ,y之间有一条路,长度为w。
G[x].push_back(y) , G[y].push_back(x);
cost[x].push_back(w) , cost[y].push_back(w);
}
spfa(1);
for(int i = 1;i <= n;i++) printf("%d %d\n",i,dis[i]);
}
spfa模板
最新推荐文章于 2023-06-18 13:52:14 发布