最短路徑(Dijkstra)-HDU 1874-暢通工程續
阿新 • • 發佈:2018-11-19
-
最短路徑(Dijkstra)-HDU 1874-暢通工程續
-
題目連結:
暢通工程續
-
題目基礎:
最短路徑-Dijkstra(迪傑斯特拉)演算法
-
思路:
題目大意:
略略略
題解:
可能都有個習慣,一篇演算法兩篇水題
就說下怎樣判斷 S-T之間有無最短路:bool Vis 是用於標記加入最短路的標記陣列,如果頂點a在最短路,那麼Vis[a]=true,所以,如果Vis[T]=false ,說明最短路不存在
-
程式碼:
#include <iostream> #include<memory.h> using namespace std; #define MAX_SIZE 1024 #define INF 65535 //鄰接圖 struct MGrapth { int Vexs[MAX_SIZE]; //頂點表 int Arc[MAX_SIZE][MAX_SIZE]; //鄰接矩陣 int Num_Vertext,Num_Edges; //頂點數,邊數 }; MGrapth Map; int Path[MAX_SIZE]; /*表示路徑 Path[i]->i*/ int Short_Path[MAX_SIZE]; /*Start->i 的最短路徑和*/ bool Vis[MAX_SIZE]; /*當前最短路徑結點true*/ void Init(int n,int m) { memset(Vis,0,sizeof(Vis)); memset(Path,0,sizeof(Path)); for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) Map.Arc[i][j]=INF; Map.Num_Vertext=n; Map.Num_Edges=m; } void Dijkstra(int Start) { int v,w,k,Min; for(v=0;v<Map.Num_Vertext;v++) Short_Path[v]=Map.Arc[Start][v]; /*Start到相連結點的距離*/ Short_Path[Start]=0; /*Start->Start 的距離為0*/ Vis[Start]=1; /*Start為當前最短路徑結點*/ for(v=1;v<Map.Num_Vertext;v++) { Min=INF; for(w=0;w<Map.Num_Vertext;w++) { if(!Vis[w]&&Short_Path[w]<Min) { k=w; Min=Short_Path[w]; } } Vis[k]=true; /*找出最短路到散點的最小值,將該散點連入最短路*/ for(w=0;w<Map.Num_Vertext;w++) /*更新最短路*/ { if(!Vis[w]&&Min+Map.Arc[k][w]<Short_Path[w]) /*圖中某點到v0的距離比當前路短,更新*/ { Short_Path[w]=Min+Map.Arc[k][w]; Path[w]=k; } } } } int main() { int N,M; int A,B,X; int S,T; while(cin>>N>>M) { Init(N,M); for(int i=0;i<M;i++) { cin>>A>>B>>X; if(Map.Arc[A][B]>X) Map.Arc[A][B]=X; if(Map.Arc[B][A]>X) Map.Arc[B][A]=X; } cin>>S>>T; Dijkstra(S); if(!Vis[T]) cout<<"-1"<<endl; else cout<<Short_Path[T]<<endl; } return 0; }