1 #include <iostream> 2 #include<stack> 3 #define M 100 4 #define N 100 5 using namespace std; 6 7 typedef struct node 8 { 9 int matrix[N][M]; //邻接矩阵 10 int n; //顶点数 11 int e; //边数 12 }MGraph; 13 14 void DijkstraPath(MGraph g,int *dist,int *path,int v0) //v0表示源顶点 15 { 16 int i,j,k; 17 bool *visited=(bool *)malloc(sizeof(bool)*g.n); 18 for(i=0;i<g.n;i++) //初始化 19 { 20 if(g.matrix[v0][i]>0&&i!=v0) 21 { 22 dist[i]=g.matrix[v0][i]; 23 path[i]=v0; //path记录最短路径上从v0到i的前一个顶点 24 } 25 else 26 { 27 dist[i]=INT_MAX; //若i不与v0直接相邻,则权值置为无穷大 28 path[i]=-1; 29 } 30 visited[i]=false; 31 path[v0]=v0; 32 dist[v0]=0; 33 } 34 visited[v0]=true; 35 for(i=1;i<g.n;i++) //循环扩展n-1次 36 { 37 int min=INT_MAX; 38 int u; 39 for(j=0;j<g.n;j++) //寻找未被扩展的权值最小的顶点 40 { 41 if(visited[j]==false&&dist[j]<min) 42 { 43 min=dist[j]; 44 u=j; 45 } 46 } 47 visited[u]=true; 48 for(k=0;k<g.n;k++) //更新dist数组的值和路径的值 49 { 50 if(visited[k]==false&&g.matrix[u][k]>0&&min+g.matrix[u][k]<dist[k]) 51 { 52 dist[k]=min+g.matrix[u][k]; 53 path[k]=u; 54 } 55 } 56 } 57 } 58 59 void showPath(int *path,int v,int v0) //打印最短路径上的各个顶点 60 { 61 stack<int> s; 62 int u=v; 63 while(v!=v0) 64 { 65 s.push(v); 66 v=path[v]; 67 } 68 s.push(v); 69 while(!s.empty()) 70 { 71 cout<<s.top()<<" "; 72 s.pop(); 73 } 74 } 75 76 int main(int argc, char *argv[]) 77 { 78 int n,e; //表示输入的顶点数和边数 79 while(cin>>n>>e&&e!=0) 80 { 81 int i,j; 82 int s,t,w; //表示存在一条边s->t,权值为w 83 MGraph g; 84 int v0; 85 int *dist=(int *)malloc(sizeof(int)*n); 86 int *path=(int *)malloc(sizeof(int)*n); 87 for(i=0;i<N;i++) 88 for(j=0;j<M;j++) 89 g.matrix[i][j]=0; 90 g.n=n; 91 g.e=e; 92 for(i=0;i<e;i++) 93 { 94 cin>>s>>t>>w; 95 g.matrix[s][t]=w; 96 } 97 cin>>v0; //输入源顶点 98 DijkstraPath(g,dist,path,v0); 99 for(i=0;i<n;i++) 100 { 101 if(i!=v0) 102 { 103 showPath(path,i,v0); 104 cout<<dist[i]<<endl; 105 } 106 } 107 } 108 return 0; 109 }
迪杰斯特拉算法基本依据是:在带权有向图G=(V,E)中,有n个顶点,从顶点v开始的最短路径有n-1条,他们的起点都是v,而终点是V中出v之外的n-1个顶点。在这n-1条最短路径中,首先求第一条最短路径,该路径是依附于v的直接路径,或者是一条经过第一条路径的基础产生的间接的最短路径。不断重复,直到找到n-1条最短路径为止。
该算法其实是一个贪心算法。
该算法适合于权值不为负数的有向图的单源最短路径。
原文:http://www.cnblogs.com/WDKER/p/5161380.html