1. 程式人生 > >暢通工程續 HDU-1874【最短路】

暢通工程續 HDU-1874【最短路】

題目描述

某省自從實行了很多年的暢通工程計劃後,終於修建了很多路。不過路多了也不好,每次要從一個城鎮到另一個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另一些方案行走的距離要短很多。這讓行人很困擾。 現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走多少距離。

思路

Prim演算法: 裸的Dijkstra演算法資料範圍小,不需要優化記憶體及演算法就可以ac

程式碼:

#include <bits/stdc++.h>
using namespace std;

#define MAX 210
#define INF 0x3f3f3f3f

int dist[MAX]
, mat[MAX][MAX], vis[MAX]; void init(int n) { memset(vis, 0, sizeof(vis)); for(int i = 0; i<n; i++) { for(int j = 0; j<n; j++) mat[i][j] = INF; dist[i] = INF; } } void Union(int x, int y, int val) { if(val < mat[x][y]) { mat[x][y] =
mat[y][x] = val; } } void Dijkstra(int n, int v) { dist[v] = 0; for(int i = 0; i<n; i++) { int min_vertex, min_dist = INF; for(int j = 0; j<n; j++) { if(!vis[j] && dist[j] < min_dist) { min_dist = dist[j]
; min_vertex = j; } } vis[min_vertex] = 1; for(int j = 0; j<n; j++) { if(!vis[j] && mat[min_vertex][j] + min_dist < dist[j]) { dist[j] = mat[min_vertex][j] + min_dist; } } } } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m; while(cin >> n >> m) { init(n); for(int i = 0; i<m; i++) { int x, y, val; cin >> x >> y >> val; Union(x, y, val); } int star, End; cin >> star >> End; Dijkstra(n, star); dist[End] == INF ? cout << -1 << endl : cout << dist[End] << endl; } return 0; }