標籤:dijkstra 模板
轉載請註明出處:http://blog.csdn.net/u012860063?viewmode=contents
模板奉上:
#include <cstdio>#include <iostream>#include <algorithm>#define MAX 100#define INF 1000000000using namespace std;int dijkstra (int mat[][MAX],int n, int s,int f){//s為起點, f:為終點int dis[MAX];//記錄到任意點的最短距離int mark[MAX];//記錄被選中的結點 int i,j,k = 0;for(i = 0 ; i < n ; i++)//初始化所有結點,每個結點都沒有被選中 mark[i] = 0; for(i = 0 ; i < n ; i++)//將每個結點到start結點weight記錄為當前distance { dis[i] = mat[s][i]; //path[i] = s; } mark[s] = 1;//start結點被選中 //path[s] = 0; dis[s] = 0;//將start結點的的距離設定為0 int min ;//設定最短的距離。 for(i = 1 ; i < n; i++) { min = INF; for(j = 0 ; j < n;j++) { if(mark[j] == 0 && dis[j] < min)//未被選中的結點中,距離最短的被選中 { min = dis[j] ; k = j; } } mark[k] = 1;//標記為被選中 for(j = 0 ; j < n ; j++) { if( mark[j] == 0 && (dis[j] > (dis[k] + mat[k][j])))//修改剩餘結點的最短距離 { dis[j] = dis[k] + mat[k][j]; } } } return dis[f]; } int mat[MAX][MAX];int main(){ int n,m; while(scanf("%d %d",&n,&m)) { int a,b,dis; if(n == 0 || m == 0) break; int i,j; for(i = 0 ; i < n;i++) for(j = 0 ; j < n; j++) mat[i][j] = INF;for(i = 0 ; i < m ;i++){scanf("%d %d %d",&a,&b,&dis);--a,--b;if(dis < mat[a][b] || dis < mat[b][a])mat[a][b] = mat[b][a] = dis;}int ans = dijkstra(mat,n,0,n-1);printf("%d\n",ans); }return 0;}