迪杰斯特拉

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;
}

posted @ 2025-08-10 17:08  .N1nEmAn  阅读(12)  评论(0)    收藏  举报