Day65 圖論第九天
卡碼網47.參加科學大會
#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; // p1 指向 p2,權值為 valgrid[p1].push_back(Edge(p2, val));}int start = 1; // 起點int end = n; // 終點// 存儲從源點到每個節點的最短距離std::vector<int> minDist(n + 1, INT_MAX);// 記錄頂點是否被訪問過std::vector<bool> visited(n + 1, false); // 優先隊列中存放 pair<節點,源點到該節點的權值>priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pq;// 初始化隊列,源點到源點的距離為0,所以初始為0pq.push(pair<int, int>(start, 0)); minDist[start] = 0; // 起始點到自身的距離為0while (!pq.empty()) {// 1. 第一步,選源點到哪個節點近且該節點未被訪問過 (通過優先級隊列來實現)// <節點, 源點到該節點的距離>pair<int, int> cur = pq.top(); pq.pop();if (visited[cur.first]) continue;// 2. 第二步,該最近節點被標記訪問過visited[cur.first] = true;// 3. 第三步,更新非訪問節點到源點的距離(即更新minDist數組)for (Edge edge : grid[cur.first]) { // 遍歷 cur指向的節點,cur指向的節點為 edge// cur指向的節點edge.to,這條邊的權值為 edge.valif (!visited[edge.to] && minDist[cur.first] + edge.val < minDist[edge.to]) { // 更新minDistminDist[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; // 到達終點最短路徑
}
卡碼網94. 城市間貨物運輸 I
#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;// 將所有邊保存起來for(int i = 0; i < m; i++){cin >> p1 >> p2 >> val;// p1 指向 p2,權值為 valgrid.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++) { // 對所有邊 松弛 n-1 次for (vector<int> &side : grid) { // 每一次松弛,都是對所有邊進行松弛int from = side[0]; // 邊的出發點int to = side[1]; // 邊的到達點int price = side[2]; // 邊的權值// 松弛操作 // minDist[from] != INT_MAX 防止從未計算過的節點出發if (minDist[from] != INT_MAX && minDist[to] > minDist[from] + price) { minDist[to] = minDist[from] + price; }}}if (minDist[end] == INT_MAX) cout << "unconnected" << endl; // 不能到達終點else cout << minDist[end] << endl; // 到達終點最短路徑}
這是什么啊,還是得好好再看一遍。