题目链接:HDU-1874
[kuangbin带你飞]专题六最短路
题目描述:
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
思路
Prim算法:
裸的Dijkstra算法数据范围小,不需要优化内存及算法就可以ac
代码:
#include <bits/stdc++.h>
using namespace std;#define MAX 210
#define INF 0x3f3f3f3fint 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;
}