堆优化
对堆的前置知识未曾涉及,暂且搁置。
城市间货物运输
题目理解
节点之间存在方向,并且节点之间的连接具有权重,给出连通首尾节点的最小权重。
寻宝题目中需要连接所有节点,节点之间的连接无向。
科学家开会中需要连接首尾,连接具有权重。
这道题和科学家开会的区别在哪里?
确实没有区别。只是权重中可以出现负值。
为啥不能使用朴素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是够牛的。我是想不到。
浙公网安备 33010602011771号