1
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <climits>
using namespace std;
//思路就是每次构成一个最短的,下次从最短的下一个开始不断构造最短的,即可!
int main()
{
int n,m,x,y,z;
vector<vector<pair<int,int>>> ev;
int s = 1;
vector<int> dist;
int e,v;
int news=1;
vector<int> path;
vector<int> visit;
cin >> n >> m;
ev.resize(n+1);
dist.resize(n+1);
visit.resize(n+1);
dist[0] = INT_MAX;
for (int i = 0; i < m; i ++ ){
cin >> x >> y >> z;
ev[x].push_back({y,z});
}
for (int i = 0; i < n; i ++ ){//循环n次
s = news;
//path.push_back(s);
visit[s] = 1;//访问过的不要重复访问
news = 0;
for(int j = 0; j < ev[s].size(); j++){
e = ev[s][j].first;
v = ev[s][j].second;
if(e==s)continue;
dist[e] = (dist[s]+v<dist[e]||!dist[e])?dist[s]+v:dist[e];
news = (dist[e]<dist[news]&&visit[e]==0)?e:news;
}
}
cout << (dist[n]!=0?dist[n]:-1);
//for(int x:path)cout << x << " ";
return 0;
}
优先队列实现
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <climits>
using namespace std;
//每次都选取dist最小的来找下一个点,如果更小就更新
//使用优先队列来实现
int main()
{
int n,m,a,b,c;
cin >> n >> m;
vector<vector<pair<int,int>>> ev(n+1);
vector<int> dist(n+1);
while (m -- ){
cin >> a >> b >> c;
ev[a].push_back({b,c});
}
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> de;
//参数意思为你的类型,类型的容器,方法greater还是less
de.push({0,1});
for (int i = 0; i <= n; i ++ ){
dist[i] = INT_MAX;
}
dist[1] = 0;
int s = 1;
int d,u,e,v;
while(de.size()){//结束条件是队列空了而不是循环n次
d = de.top().first;
u = de.top().second;
de.pop();
if(d > dist[u])continue;
for (int i = 0; i < ev[u].size(); i ++ ){//遍历全部的下一个节点
e = ev[u][i].first;
v = ev[u][i].second;
if(dist[u]+v<dist[e]){
dist[e] = dist[u] + v;
de.push({dist[e], e});
}
}
}
cout << (dist[n]==INT_MAX?-1:dist[n]);
return 0;
}