1. 程式人生 > >【HDOJ】1874-暢通工程續(最短路徑dijkstra)

【HDOJ】1874-暢通工程續(最短路徑dijkstra)

amp include using get dijk 找到 間距 距離 ace

1874-暢通工程續

http://acm.hdu.edu.cn/showproblem.php?pid=1874

題意:略。

思路:最短路dijkstra模板,不過要先要把題裏輸入的把兩點間距離賦值給構建的矩陣。

dijkstra算法

#include<bits/stdc++.h>
using namespace std;
#define inf 99999999
#define maxn 210
int maps[maxn][maxn], dis[maxn], visited[maxn];
int n, m;
using namespace std;

int dijkstra(int
s, int t) { for(int i = 0; i < n; i++) { dis[i] = maps[s][i]; visited[i] = 0; } dis[s] = 0; visited[s] = 1; int temp, k; //這個循環的意思是把這一點的這一行都找到最短路徑 for(int i = 0; i < n; i++) { temp = inf; //找最小距離的一點 for(int j = 0; j < n; j++) {
if(visited[j] == 0 && temp > dis[j]) { k = j; temp = dis[j]; } } //這一點沒有與別的點相連,跳出循環 if(temp == inf) break; visited[k] = 1; for(int j = 0; j < n; j++) { if(dis[j] > dis[k] + maps[k][j]) dis[j]
= dis[k] + maps[k][j]; } } if(dis[t] == inf) return -1; else return dis[t]; } int main() { int a, b, x, s, t, ans; while(scanf("%d %d", &n, &m) != EOF) { //構建矩陣,是各點之間的距離 for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) maps[i][j] = (i == j ? 0 : inf); while(m--) { scanf("%d%d%d", &a, &b, &x); //把兩點間距離賦值給矩陣 if(x < maps[a][b]) maps[a][b] = maps[b][a] = x; } scanf("%d %d", &s, &t); ans = dijkstra(s, t); printf("%d\n", ans); } return 0; }

floyd算法:

待補充

【HDOJ】1874-暢通工程續(最短路徑dijkstra)