暢通工程續(HDU 1874)(簡單最短路)
阿新 • • 發佈:2018-12-16
某省自從實行了很多年的暢通工程計劃後,終於修建了很多路。不過路多了也不好,每次要從一個城鎮到另一個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另一些方案行走的距離要短很多。這讓行人很困擾。 現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走多少距離。
Input
本題目包含多組資料,請處理到檔案結束。 每組資料第一行包含兩個正整數N和M(0<N<200,0<M<1000),分別代表現有城鎮的數目和已修建的道路的數目。城鎮分別以0~N-1編號。 接下來是M行道路資訊。每一行有三個整數A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城鎮A和城鎮B之間有一條長度為X的雙向道路。 再接下一行有兩個整數S,T(0<=S,T<N),分別代表起點和終點。
Output
對於每組資料,請在一行裡輸出最短需要行走的距離。如果不存在從S到T的路線,就輸出-1.
Sample Input
3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
Sample Output
2 -1
#include <bits/stdc++.h> using namespace std; int m,n; const int inf = 0x3f3f3f3f; int dis[1005]; int gra[405][405]; int vis[1005]; void dj(int s, int t) { memset(vis,0,sizeof(vis)); int minn, v; for(int i = 0; i < n; i ++) dis[i] = gra[s][i]; for(int i = 1; i <= n; i ++) { minn = inf; for(int j = 0; j < n; j ++) { if(!vis[j] && dis[j] < minn) { v = j; minn = dis[j]; } } vis[v] = 1; for(int j = 0; j < n; j ++) { if(gra[v][j] + dis[v] < dis[j] && !vis[j]) { dis[j] = gra[v][j] + dis[v]; } } } if(dis[t] == inf)printf("-1\n"); else printf("%d\n",dis[t]); } int main() { int i, j, a, b, c, s, t; while(~scanf("%d%d", &n, &m)) { for(i = 0; i < n; i ++) { for(j = 0; j < n; j ++) { if(i == j) gra[i][j] = 0; else gra[i][j] = gra[j][i] = inf; } } for(i = 1; i <= m; i ++) { scanf("%d%d%d", &a, &b, &c); if(gra[a][b] > c) gra[a][b] = gra[b][a] = c; } scanf("%d %d",&s,&t); dj(s,t); } return 0; }