#include<bits/stdc++.h>usingnamespace std;typedeflonglong ll;typedef pair<ll, ll> pll;constint maxn =100050;int INF =0x3f;
vector<pll> g[maxn];
ll dis[maxn];bool vis[maxn];
queue<ll> q;
ll n, m, s;//动态规划实际上是在一张有向无环图上进行拓扑排序的过程//bfs求最短路的关键是最短路随着入队循序单调递增的 voidspfa(){memset(dis, INF,sizeof(dis));
dis[s]=0;
q.push(s);
vis[s]=1;while(!q.empty()){
ll now = q.front(); q.pop();
vis[now]=0;// 反复横跳 for(auto to:g[now]){
ll w = to.second, v = to.first;if(dis[now]+w < dis[v]){
dis[v]= dis[now]+ w;if(vis[v]==0)//这个点可以去更新其他点,因为你更新的到它的距离 {
q.push(v);
vis[v]=1;}}}}}intmain(){
cin >> n >> m >> s;
ll u,v,w;for(int i =1; i <= m; i++){
cin >> u >> v >> w;
g[u].push_back({v,w});}spfa();for(int i =1; i <= n; i++)
cout << dis[i]<<" ";
cout << endl;return0;}
2.堆优化的dijks
#include<iostream>#include<cstdio>#include<vector>#include<queue>usingnamespace std;typedef pair<int,int> pii;// <w, v>constint maxn =100050;int dis[maxn];bool vis[maxn];
priority_queue<pii,vector<pii>, greater<pii>> q;
vector<pii> g[maxn];int n, m, s;voiddijk(){
dis[s]=0;
q.push(make_pair(0,s));while(!q.empty()){int now = q.top().second; q.pop();if(vis[now])continue;
vis[now]=1;for(auto to: g[now]){int w = to.first, v = to.second;if(dis[now]+ w < dis[v]){
dis[v]= dis[now]+ w;
q.push({dis[v], v});}}}}intmain(){
cin >> n >> m >> s;int u,v,w;for(int i =1; i <= m; i++){
cin >> u >> v >> w;
g[u].push_back({w,v});}memset(dis,0x3f,sizeof(dis));dijk();for(int i =1; i <= n; i++)
cout << dis[i]<<" ";
cout << endl;return0;}
1. spfa(可检测负环)#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<ll, ll> pll;const int maxn = 100050;int INF = 0x3f;vector<pll> g[maxn];ll dis[maxn];bool vis[maxn];queue<ll> q;ll n, m, s;//动态规划实