KamaCoder47. 参加科学大会
题目链接:47. 参加科学大会(第六期模拟笔试)
堆优化文章讲解:代码随想录
堆优化视频讲解:图论:最短路算法之Dijkstra(堆优化版)| 迪杰斯特拉算法_哔哩哔哩_bilibili
堆优化思路:堆优化主要优化的是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;
}
};
struct Edge {
int to;
int val;
Edge(int t,int w):to(t),val(w){}
};
int main() {
int n,m,p1,p2,val;
cin>>n>>m;
vector<list<Edge>>grid(n+1);
for(int i=0;i<m;i++){
cin>>p1>>p2>>val;
grid[p1].push_back(Edge(p2, val));
}
int start = 1;
int end = n;
vector<int> minDist(n + 1, INT_MAX);
vector<bool> visited(n + 1, false);
priority_queue<pair<int, int>, vector<pair<int, int>>,mycomparison>pq;
pq.push(pair<int,int>(start,0));
minDist[start]=0;
while (!pq.empty()) {
pair<int, int>cur=pq.top();
pq.pop();
if (visited[cur.first]){
continue;
}
visited[cur.first]=true;
for (Edge edge:grid[cur.first]) {
if (!visited[edge.to]&&minDist[cur.first]+edge.val<minDist[edge.to]) {
minDist[edge.to]=minDist[cur.first]+edge.val;
pq.push(pair<int, int>(edge.to, minDist[edge.to]));
}
}
}
if (minDist[end] == INT_MAX){
cout<<-1<<endl;
}
else{
cout<<minDist[end]<<endl;
}
}
KamaCoder94. 城市间货物运输 I
题目链接:94. 城市间货物运输 I
文章讲解:代码随想录
视频讲解:图论:一期视频,学透最短路算法之Bellman-ford算法 | 贝尔曼-福特算法_哔哩哔哩_bilibili
思路:bellman-ford算法主要应用于解决有负权值的最短路问题,dijkstra是解决不了的。这个算法的核心思想在于对每一条边进行n-1次的松弛操作,那么这个操作具体来说是什么样的呢?就是对这个边进行
if(mindist[from]!=INT_MAX&&mindist[to]>mindist[from]+price){
mindist[to]=mindist[from]+price;
}
这样的操作,我们需要对每一条边进行n-1次,也就是对所有边遍历n-1次。
代码:
#include<iostream>
#include<vector>
#include<climits>
#include<list>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
vector<vector<int>>grid;
int p1,p2,val;
while(m--){
cin>>p1>>p2>>val;
grid.push_back({p1,p2,val});
}
int start=1;
int end=n;
vector<int>mindist(n+1,INT_MAX);
mindist[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(mindist[from]!=INT_MAX&&mindist[to]>mindist[from]+price){
mindist[to]=mindist[from]+price;
}
}
}
if(mindist[n]==INT_MAX){
cout<<"unconnected"<<endl;
}
else{
cout<<mindist[n]<<endl;
}
}
421

被折叠的 条评论
为什么被折叠?



