最短路
spfa
时间复杂度
#include <bits/stdc++.h>
using namespace std;
struct poi{
int v, w;
};
int n, m, s;
queue<int> q;
bool vis[100005];
long long d[100005];
long long cnt[100005];
vector<poi> g[100005];
void spfa(int st)
{
memset(d, 127, sizeof(d));
memset(vis, 0, sizeof(vis));
d[st] = 0;
vis[st] = 1;
q.push(st);
while(!q.empty()){
int k = q.front();
q.pop();
vis[k] = 0;
for(int i = 0; i < g[k].size(); i++){
int v = g[k][i].v;
int w = g[k][i].w;
if(d[k] + w < d[v]){
d[v] = d[k] + w;
if(!vis[v]){
vis[v] = 1;
q.push(v);
cnt[v]++;
if(cnt[k] > n) cout << -1, exit(0);//负环
}
}
}
}
}
int main()
{
cin >> n >> m >> s;
for(int i = 1; i <= m; i++){
int a, b, c;
cin >> a >> b >> c;
g[a].push_back((poi){b, c});
}
spfa(s);
cout << d[n];
return 0;
}
dijkstra
void floyd()
{
memset(f, 127, sizeof(f));
for(int k = 1; k <= n; k++){
for(int i = 1; i <= n; i++){
f[i][i] = 0;
for(int j = 1; j <= n; j++){
f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
}
}
}
}