当前位置: 首页 > news >正文

【Day50 LeetCode】图论问题 Ⅷ

一、图论问题 Ⅷ

1、dijkstra算法 堆优化

采用堆来优化,适合节点多的稀疏图。代码如下:

# include<iostream>
# include<vector>
# include<list>
# include<queue>
# include<climits>

using namespace std;

class mycomparison {
public:
    bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
        return lhs.second > rhs.second;
    }
};

int main(){
    int n, m;
    cin >> n >> m;
    int s, e, v;
    vector<list<pair<int, int>>> grid(n+1);
    for(int i=0; i<m; ++i){
        cin >> s >> e >> v;
        grid[s].push_back(pair<int, int>(e, v));
    }
    vector<int> minDist(n+1, INT_MAX);
    vector<bool> visited(n+1, false);
    int start = 1, end = n;
    minDist[start] = 0;
    priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pq;
    pq.push(pair<int, int>(start, 0));
    while(!pq.empty()){
        // 1、选取源点到未被访问过且距离最近的节点; 
        auto cur = pq.top(); pq.pop();
        if(visited[cur.first])
            continue;
        // 2、将最近节点标记为访问过 
        visited[cur.first] = true;
        // 3、更新非访问节点到源点的距离
        for(auto edge : grid[cur.first]){
            if(!visited[edge.first] && minDist[edge.first] > minDist[cur.first] + edge.second )
                minDist[edge.first] = minDist[cur.first] + edge.second;
                pq.push(pair<int, int>(edge.first, minDist[edge.first]));
        }
    }
    if(minDist[end] < INT_MAX)
        cout << minDist[end] << endl;
    else
        cout << -1 << endl;

    return 0;
}

2、Bellman_ford 算法

权值有负值的图无法采用dijdijkstra算法,这时需要使用Bellman_ford 算法来解决最短路问题。

#include <iostream>
#include <vector>
#include <list>
#include <climits>

using namespace std;

int main() {
    int n, m, p1, p2, val;
    cin >> n >> m;

    vector<vector<int>> grid;
    for(int i = 0; i < m; i++){
        cin >> p1 >> p2 >> val;
        grid.push_back({p1, p2, val});
    }
    int start = 1, end = n;  

    vector<int> minDist(n + 1 , INT_MAX);
    minDist[start] = 0;
    for (int i = 1; i < n; i++) { // 对所有边 松弛 n-1 次
        for (vector<int> &side : grid) { // 每一次松弛,都是对所有边进行松弛
            int from = side[0]; // 边的出发点
            int to = side[1]; // 边的到达点
            int price = side[2]; // 边的权值
            // 松弛操作 
            // minDist[from] != INT_MAX 防止从未计算过的节点出发
            if (minDist[from] != INT_MAX && minDist[to] > minDist[from] + price) { 
                minDist[to] = minDist[from] + price;  
            }
        }
    }
    if (minDist[end] == INT_MAX)
        cout << "unconnected" << endl; // 不能到达终点
    else
        cout << minDist[end] << endl; // 到达终点最短路径
    return 0;
}

参考资料
代码随想录

相关文章:

  • fody引用c++的dll合并后提示找不到
  • 【MySQL】(1) 数据库基础
  • jQuery UI API 文档
  • Spring Boot 整合 MyBatis 与 PostgreSQL 实战指南
  • kafka-web管理工具cmak
  • GPT 与BERT的异同
  • pta天梯L1-009 N个数求和
  • 第一章:觉醒
  • 【GPU机器数据传输】Linux系统中跨机器大规模数据传输,rsync | bbcp | scp | sftp 对比。
  • Python 字典与集合:从入门到精通的全面解析
  • win10下安装wireshark的问题
  • C#中使用System.Net库实现自动发送邮件功能
  • 汽车v型推力杆总成三维5自由度性能及疲劳测试系统
  • Python解决“比赛配对”问题
  • 进程 ─── linux第10课
  • easyx--上半部分
  • DeepSeek写连连看手机小游戏
  • 算法题(80):环形链表II
  • 002 docker安装rocketmq
  • C#上位机--二级运算符
  • 临武县网站建设/百度软件开放平台
  • zencart网站/比较好用的搜索引擎
  • 襄阳网站建设价格/为什么不能去外包公司
  • 网页游戏开服表最全/路由器优化大师
  • 网站建设的总结/友情链接模板
  • 家具网站开发任务书/外贸网站哪个比较好