堆优化

对堆的前置知识未曾涉及,暂且搁置。

城市间货物运输

题目理解

节点之间存在方向,并且节点之间的连接具有权重,给出连通首尾节点的最小权重。
寻宝题目中需要连接所有节点,节点之间的连接无向。
科学家开会中需要连接首尾,连接具有权重。

这道题和科学家开会的区别在哪里?
确实没有区别。只是权重中可以出现负值。
为啥不能使用朴素djikstra算法?
djikstra算法 通过不断访问节点,更新节点到源点的最小值实现最短。
输入:
5 5
1 2 100
1 3 1
2 3 -300
3 4 1
4 5 1
朴素djikstra的输出会是:3(1->3->4->5)
正确输出应该是:-198
类似于前期挥霍掉太多,后期无论怎么补偿,错过的节点已经不会再在原地等你了。
朴素想法依然是给出所有可以连接首尾的路并计算权重,找出最小。

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;
    while(m--){
        cin>>p1>>p2>>val;
        grid.push_back({p1,p2,val});
    }
    int start=1;
    int end=n;
    vector<int> minDi(n+1,INT_MAX);
    minDi[start]=0;
    for(int i=1;i<n;i++){
        for(vector<int>&side:grid){
            int from=side[0];
            int to=side[1];
            int price=side[2];
            if(minDi[from]!=INT_MAX&&minDi[to]>minDi[from]+price){
                minDi[to]=minDi[from]+price;
            }
        }
    }
    if(minDi[end]==INT_MAX) cout<<"unconnected"<<endl;
    else cout<<minDi[end]<<endl;
}

小结

确实没有理解哈。我只能说Bellman和ford是够牛的。我是想不到。

posted on 2026-01-11 01:40  FAfa_C++  阅读(3)  评论(0)    收藏  举报