【HDOJ】1874-暢通工程續(最短路徑dijkstra)
阿新 • • 發佈:2018-04-21
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(ints, 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)