Dijkstra演算法-最短路徑-鄰接矩陣表示
阿新 • • 發佈:2019-01-22
圖結構練習——最短路徑
Time Limit: 1000MS Memory Limit: 65536KBProblem Description
給定一個帶權無向圖,求節點1到節點n的最短路徑。Input
輸入包含多組資料,格式如下。 第一行包括兩個整數n m,代表節點個數和邊的個數。(n<=100) 剩下m行每行3個正整數a b c,代表節點a和節點b之間有一條邊,權值為c。Output
每組輸出佔一行,僅輸出從1到n的最短路徑權值。(保證最短路徑存在)Example Input
3 2 1 2 1 1 3 1 1 0
Example Output
1 0
#include<stdio.h> #define MAXINT 65535 #define N 10005 int Pic[N][N]; int PointValue[N]; int Path[N]; int Check[N]; int front=0; int rear=0; void Init(int l){ int row; int col; int v; for(int i=0;i<l;i++){ scanf("%d %d %d",&row,&col,&v); if(Pic[row-1][col-1]>v){ Pic[row-1][col-1]=v; Pic[col-1][row-1]=v; } } } void RollBack(int n){ for(int i=0;i<n;i++){ PointValue[i]=0; Path[i]=0; Check[i]=0; for(int j=0;j<n;j++){ Pic[i][j]=MAXINT; } } front=0; rear=0; } int Mix(int a[],int n){ int Mix=MAXINT; int k=0; for(int i=0;i<n;i++){ if(!Check[i]&&Mix>a[i]){ Mix=a[i]; k=i; } } return k; } void ShortPath(int start,int end,int n){ PointValue[0]=0; Path[rear++]=start; Check[start]=1; for(int i=1;i<n;i++){ if(Pic[start][i]) PointValue[i]=Pic[start][i]; else PointValue[i]=MAXINT; } int j=1; int Num=n-1; while(Num--){ for(int k=0;k<n;k++){ if(Pic[j][k]&&PointValue[j]+Pic[j][k]<PointValue[k]&&!Check[k]){ PointValue[k]=PointValue[j]+Pic[j][k]; } } int v=Mix(PointValue,n); Check[v]=1; Path[rear++]=v; j=v; } } int main(){ int k,m; while(scanf("%d %d",&k,&m)!=EOF){ RollBack(k); Init(m); ShortPath(0,k,k); printf("%d\n",PointValue[k-1]); //printf("\n"); } return 0; }
提交了好幾次都沒過,之前沒有考慮這是無向圖,所擁有的邊可能不只一條,即最先輸入的邊不一定是最小的,這需要再輸入的時候加以確認。
最短路徑Dijkstra演算法
Check陣列 檢測該點是否被訪問;
PointValue陣列 動態儲存由原點到該點的最短距離;
Pic鄰接矩陣儲存各個點之間的關係(權值);
通過一個一維陣列儲存又原點到該點的最短距離,並將此點設定為已訪問,在從該點開始訪問與之相連的各個節點,dk=Mix(dk,dj+(path:由j-k的路徑長)/*Pic[j][k]*/)
迴圈遍歷,直到所有的點全部訪問完畢!