1. 程式人生 > >Dijkstra演算法-最短路徑-鄰接矩陣表示

Dijkstra演算法-最短路徑-鄰接矩陣表示

圖結構練習——最短路徑

Time Limit: 1000MS Memory Limit: 65536KB

Problem 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]*/)

迴圈遍歷,直到所有的點全部訪問完畢!