备份

本文介绍了一种使用Dijkstra算法寻找带权图中两点间最短路径的方法,并通过优先队列进行优化,同时还提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <iostream>
#include <stack>
#include <string.h>
#include <queue>
#include <cmath>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
#include <string>
using namespace std;
typedef long long LL;

/*
int m, n ;
int a[105][105];
int b[105][105];
int check(int x, int y) {
    if (0 <= x && x < n && 0 <= y && y < m) {
        return 1;
    } else {
        return 0;
    }
}
int dx[8] = {0, 0, 1, 1, 1, -1, -1, -1};
int dy[8] = {-1, 1, -1, 0, 1, 0, 1, -1};

bool cmp(pair<int, int> a, pair<int, int> b)
{
    if(a.second != b.second){
        return a.second < b.second;
    }
}

*/
int n, m, x;
struct edge {
    int to;
    int w;
};

vector<edge> G[1005];
vector<edge> rG[1005];

int d[1005];

#define INF 0x3fffffff

struct Node {
    int to;
    int d;

    Node (int _to, int _d) {
        to = _to;
        d = _d;
    }

    bool operator < (const Node b) const {
        return d > b.d;
    }
    bool operator > (const Node b) const {
        return d < b.d;
    }
};

void short_path(int s) {
    for (int i = 0; i < n; i++) {
        d[i] = INF;
    }

    priority_queue<Node> q;
    d[s] = 0;
    q.push(Node(s, 0));

    while (!q.empty()) {
        Node cur = q.top();
        q.pop();
        //if (d[cur.to] < cur.d) continue;
        for (int i = 0; i < G[cur.to].size(); i++) {
            edge e = G[cur.to][i];
            if (d[e.to] > d[cur.to] + e.w) {
                d[e.to] = d[cur.to] + e.w;
                q.push(Node(cur.to, d[e.to]));
            }
        }
    }
}

void short_rpath(int s) {
    for (int i = 0; i < n; i++) {
        d[i] = INF;
    }

    priority_queue<Node> q;
    d[s] = 0;
    q.push(Node(s, 0));

    while (!q.empty()) {
        Node cur = q.top();
        q.pop();
        //if (d[cur.to] < cur.d) continue;
        for (int i = 0; i < G[cur.to].size(); i++) {
            edge e = G[cur.to][i];
            if (d[e.to] > d[cur.to] + e.w) {
                d[e.to] = d[cur.to] + e.w;
                q.push(Node(cur.to, d[e.to]));
            }
        }
    }
}


void add_edge(int u, int v, int w) {
    edge e;
    e.to = v;
    e.w = w;
    G[u].push_back(e);
    /*
    e.to = u;
    e.w = w;
    G[v].push_back(e);
    */
}

void add_redge(int u, int v, int w) {
    edge e;
    e.to = v;
    e.w = w;
    rG[u].push_back(e);
    /*
    e.to = u;
    e.w = w;
    G[v].push_back(e);
    */
}

int main() {
    cin >> n >> m >> x;
    for (int i = 0; i < m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        add_edge(u, v, w);
        add_redge(v, u, w);
    }


    short_path(x);
    int ans = 0;
    for (int i = 0; i < n; i++) {
        if (d[i] != INF)
            ans = max(ans, *d[i]);
    }

    short_rpath(x);


    for (int i = 0; i < n; i++) {
        if (d[i] != INF && i != x)
            ans = max(ans, 2*d[i]);
    }




/*
    freopen("in.txt", "r", stdin);
    //freopen("out.txt","w",stdout);
    map<int, double> mapp1;
    int n;
    cin >> n;
    for(int i = 0; i < n; i++){
        int esp;
        double coeff;
        cin >> esp >> coeff;
        if(mapp1[esp] != 0){
            mapp1[esp] += coeff;
        }else {
            mapp1[esp] = coeff;
        }
    }
    int m;
    cin >> m;
    for(int i = 0; i < m; i++){
        int esp;
        double coeff;
        cin >> esp >> coeff;
        if(mapp1[esp] != (double)0.0){
            mapp1[esp] += coeff;
        }else {
            mapp1[esp] = coeff;
        }
    }
    vector<pair<int, double>> v1(mapp1.begin(), mapp1.end());
    sort(v1.begin(), v1.end(), cmp);
    vector<pair<int, double> > v2;
    for(int i = 0; i < v1.size(); i++){
        if(v1[i].second != (double)0.0){
            pair<int, double> x(v1[i].first, v1[i].second);
            v2.push_back(x);
        }
    }
    cout << v2.size();
    for(int i = 0; i < v2.size(); i++){
        printf(" %d %.1lf", v2[i].first, v2[i].second);
    }
*/


    /*cin >> n >> m;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> a[i][j];
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            int num = 0;
            for (int k = 0; k < 8; k++) {
                int x = i + dx[k];
                int y = j + dy[k];
                if (check(x, y) && a[x][y] == 1) {
                    num++;
                }
            }
            if (a[i][j] == 1) {
                if (num < 2 || num > 3) {
                    b[i][j] = 0;
                } else if (num == 2 || num == 3){
                    b[i][j] = 1;
                }
            } else {
                if (num == 3) {
                    b[i][j] = 1;
                }
            }
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (j == 0) {
                cout << b[i][j];
            } else {
                cout << " " << b[i][j];
            }

        }
        cout << endl;
    }*/
    /*
   // freopen("in.txt", "r", stdin);
    int n;
    map<int, int> mapp;
    vector<pair<int, int>> vec;
    int num;
    while(scanf("%d", &num) && num){
        //if(n == 0) break;
        //int num;
       // cin >> num;
        if(num == 1){
            int id, P;
            cin >> id >> P;
            //mapp[id] = P;
            vec.insert(vec.begin(), make_pair(id, P));
            sort(vec.begin(), vec.end(), cmp);
        }else if(num == 2){
            if(vec.size() != 0){
                //sort(mapp.begin(),mapp.end(), cmp);

                sort(vec.begin(), vec.end(), cmp);
                vector<pair<int, int>>::iterator iter;
                iter = vec.end();
                iter--;
                cout << iter -> first << endl;
                vec.erase(iter);
            }else{
                cout << "0" << endl;
            }
        }else if(num == 3){
            if(vec.size() != 0){
               // vector<pair<int, int>> vec(mapp.begin(), mapp.end());
                sort(vec.begin(), vec.end(), cmp);
                vector<pair<int, int>>::iterator iter;
                iter = vec.begin();
                cout << iter -> first << endl;
                vec.erase(iter);
            }else{
                cout << "0" << endl;
            }
        }

    }
    */

    /*
    int T;
    cin >> T;
    while (T--) {
        int n, k;
        cin >> n >> k;
        int m[105];
        int p[105];
        int pre[105];
        int ans[105];
        memset(m, 0, sizeof(m));
        memset(p, 0, sizeof(p));
        memset(pre, 0, sizeof(pre));
        memset(ans, 0, sizeof(ans));
        for (int i = 1; i <= n; i++) {
            cin >> m[i];
        }
        for (int i = 1; i <= n; i++) {
            cin >> p[i];
        }
        /*
        for (int i = 2; i <= n; i++) {
            for (int j = i-1; j >= 1; j--) {
                if (m[i] - m[j] > k) {
                    pre[i] = j;
                    //cout << "i = " << i <<  " j = " <<  j << endl;
                    break;
                }
            }
        }
        */
        /*
        ans[1] = p[1];
        for (int i = 2; i <= n; i++) {
            ans[i] = max(ans[i-1], p[i] + ans[pre[i]]);
           // cout << ans[i] << endl;
        }


        for (int i = 2; i <= n; i++) {
            for (int j = i-1; j >= 1; j--) {
                if (m[i] - m[j] > k) {
                    ans[i] = max(ans[i-1], p[i] + ans[j]);
                    break;
                }
            }
        }

        cout << ans[n] << endl;
    }

    */



    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值