代码随想录算法【Day60】

打印 上一主题 下一主题

主题 914|帖子 914|积分 2742

94.城市间货物运输 I
思绪
焦点思想是 队列优化的 Bellman-Ford 算法,利用队列存储待松弛的节点,并避免重复参加队列,提高效率。每次取出队首元素,对其毗邻节点进行松弛操作,若间隔更新,则将该节点参加队列,直到队列为空。终极输出最短路径,若无法到达终点,则输出 “unconnected”。
代码
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <list>
  5. #include <climits>
  6. using namespace std;
  7. struct Edge {
  8.     int to;
  9.     int val;
  10.     Edge(int t, int w): to(t), val(w) {}
  11. };
  12. int main() {
  13.     int n, m, p1, p2, val;
  14.     cin >> n >> m;
  15.     vector<list<Edge>> grid(n + 1);
  16.     vector<bool> isInQueue(n + 1);
  17.     for(int i = 0; i < m; i++){
  18.         cin >> p1 >> p2 >> val;
  19.         grid[p1].push_back(Edge(p2, val));
  20.     }
  21.     int start = 1;
  22.     int end = n;
  23.     vector<int> minDist(n + 1 , INT_MAX);
  24.     minDist[start] = 0;
  25.     queue<int> que;
  26.     que.push(start);
  27.     while (!que.empty()) {
  28.         int node = que.front(); que.pop();
  29.         isInQueue[node] = false;
  30.         for (Edge edge : grid[node]) {
  31.             int from = node;
  32.             int to = edge.to;
  33.             int value = edge.val;
  34.             if (minDist[to] > minDist[from] + value) {
  35.                 minDist[to] = minDist[from] + value;
  36.                 if (!isInQueue[to]) {
  37.                     que.push(to);
  38.                     isInQueue[to] = true;
  39.                 }
  40.             }
  41.         }
  42.     }
  43.     if (minDist[end] == INT_MAX) cout << "unconnected" << endl;
  44.     else cout << minDist[end] << endl;
  45. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表