卡码网 47 参加科学大会 Dijkstra算法(堆优化)

cpp
#include<iostream>
#include<vector>
#include <list>
#include <climits>
#include <queue>
using namespace std;
struct Edge{
int to;
int val;
Edge(int t, int w): to(t), val(w) {} ;
};
struct comparion{
bool operator ()(const pair<int, int>& a,const pair<int, int>& b) {
return a.second > b.second;
}
};
int main(){
int n,m;
cin >> n >> m;
vector<list<Edge>> graph(n+1);
int x,y,w;
for(int i = 0;i < m;i++){
cin >> x >> y >> w;
graph[x].push_back(Edge(y,w));
}
vector<bool> visit(n+1,false);
vector<int> mindistance(n+1,INT_MAX);
mindistance[1] = 0;
priority_queue<pair<int, int>,vector<pair<int, int>>,comparion> que;
que.push(pair<int, int>(1,0));
while(!que.empty()){
pair<int, int> cur = que.top();
que.pop();
visit[cur.first] = true;
for(Edge edge : graph[cur.first]){
if(!visit[edge.to] && mindistance[cur.first] + edge.val < mindistance[edge.to]){
mindistance[edge.to] = mindistance[cur.first] + edge.val;
que.push(pair<int,int>(edge.to,mindistance[edge.to]));
}
}
}
int result = mindistance[n] == INT_MAX ? -1 : mindistance[n];
cout << result;
return 0;
}
卡码网 94 城市间货物运输 I Bellman-ford算法

cpp
#include<iostream>
#include<vector>
#include <climits>
using namespace std;
int main(){
int n,m;
cin >> n >> m;
vector<vector<int>> graph;
int x,y,w;
for(int i = 0;i < m;i++){
cin >> x >> y >> w;
graph.push_back({x,y,w});
}
vector<int> mindistance(n+1,INT_MAX);
mindistance[1] = 0;
for(int i = 0;i < n;i++){
for(vector<int>& side : graph){
int from = side[0];
int to = side[1];
int val = side[2];
if(mindistance[from] != INT_MAX && mindistance[from] + val < mindistance[to]){
mindistance[to] = mindistance[from] + val;
}
}
}
if(mindistance[n] == INT_MAX) cout << "unconnected" << endl;
else cout << mindistance[n] << endl;
return 0;
}