#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;//v,w;
const int N=2e5;
//单源最短路算法//dijkstra堆优化版
vector<pii> e[N];
int d[N];
bool st[N];
priority_queue<pii> q;
int n, m;//n个元素,m条边
int dijkstra(){
for(int i=0;i<=n;i++) d[i]=0x3f3f3f3f;
d[1]=0;//初始起点
q.push({0, 1});
while(q.size()){
auto u=q.top().second;//通过小根堆找最近的点
q.pop();
if(st[u]) continue;
st[u]=1;//标记出圈
for(auto ele: e[u]){//更新
int v=ele.first, w=ele.second;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
q.push({-d[v], v});
}
}
}
//d[n],n为终点
if(d[n]==0x3f3f3f3f) return -1;
else return d[n];
}
int main() {
cin>>n>>m;
while(m--){
int a, b, c; cin>>a>>b>>c;
e[a].emplace_back(b, c);//邻接表存图
}
cout<<dijkstra();
return 0;
}
朴素版本_邻接矩阵版
#include<bits/stdc++.h>
using namespace std;
const int N=502;
int g[N][N];
int d[N];
bool st[N];
int n,m;
int dijkstra(){
for(int i=0; i<=n; i++) d[i]=0x3f3f3f3f;
d[1]=0;
for(int i=1; i<=n; i++){
int u=0;
for(int j=1; j<=n; j++){//找最近点出圈
if(!st[j] && d[j]<d[u])
u=j;
}
st[u]=1;
for(int j=1; j<=n; j++){//枚举u点
if(d[j]>d[u]+g[u][j])
d[j]=d[u]+g[u][j];
//d[j]=min(d[j], d[u]+g[u][j]);
}
}
if(d[n]!=0x3f3f3f3f) return d[n];
else return -1;
}
int main(){
memset(g, 0x3f3f3f3f, sizeof(g));
cin>>n>>m;
for(int i=0; i<m; i++){
int a,b,c; cin>>a>>b>>c;
g[a][b]=min(g[a][b], c);
}
cout<<dijkstra();
}
朴素版本_邻接图版,n<1000,较慢;
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;//v,w;
const int N=501;
vector<pii> e[N];
int d[N];
bool st[N];
int n, m;//n个元素,m条边
int dijkstra(){
for(int i=0;i<=n;i++) d[i]=0x3f3f3f3f;
d[1]=0;
for(int i=0;i<n;i++){
int u=0;
for(int j=1;j<=n;j++)
if(!st[j] && d[j]<d[u]) u=j;
st[u]=1;
for(auto ele:e[u]){
int v=ele.first, w=ele.second;
if(d[v]>d[u]+w)
d[v]=d[u]+w;
}
}
if(d[n]==0x3f3f3f3f) return -1;
else return d[n];
}
int main() {
cin >> n >> m;
while (m--) {
int a, b, c;
cin >> a >> b >> c;
e[a].emplace_back(b, c);
}
cout<<dijkstra();
return 0;
}