最短路径:Dijkstra——初探
//算法:Dijkstra
//主要思想(贪心):将图分为两部分:已确定离源点s最短距离的节点集合Q与未确定的集合P;
//
//
//
//算法正确性的简单证明(数学归纳):
//1,当n=1时,即确定的集合中元素只有源点s时,显然是集合中的元素离源点都是最短的;
//2,假设当n=k时即确定最短路径的集合中元素个数为k,结论正确;
//
//
//
//
//
//
//
#include <stdio.h> #include <memory.h> #define MAXN 10000 #define INF (1<<30) int V[MAXN][MAXN],visted[MAXN],dist[MAXN],num;//V:邻接阵表示图;visted:是否访问过 dist:表示源点到该节点的最短距离 void relax(int a,int b){if(dist[a]+V[a][b]<dist[b]) dist[b]=dist[a]+V[a][b];}//松弛 void Dijkstra(int n); int main() { int i,n,temp_1,temp_2,temp_3,sum,j; scanf("%d%d",&num,&sum); memset(visted,0,sizeof(visted));//初始化visted数组 for(i=0;i<num;i++)dist[i]=INF;//初始化dist数组 for(i=0;i<num;i++) for(j=0;j<num;j++) V[i][j]=INF; for(i=0;i<sum;i++) { scanf("%d%d%d",&temp_1,&temp_2,&temp_3); V[temp_1][temp_2]=temp_3; } scanf("%d",&n); for(i=0;i<num;i++) if(V[n][i]!=INF)dist[i]=V[n][i]; Dijkstra(n); for(i=0;i<num;i++) printf("%d-%dmin:%d\t",n,i,i==n?0:dist[i]); return 0; } void Dijkstra(int n) { int i,min,min_i; visted[n]=1; do{ min_i=-1; for(i=0;i<num;i++) //找出在未确定最短路径的集合中寻找离源点最近的节点 { if(!visted[i]) { if(min_i==-1||dist[i]<min) min_i=i,min=dist[i]; } } if(min_i==-1)break; visted[min_i]=1; for(i=0;i<num;i++) //松弛 if(V[min_i][i]&&V[min_i][i]+dist[min_i]<dist[i]) dist[i]=V[min_i][i]+dist[min_i]; }while(1); }
posted on 2011-07-21 12:11 sleeper_qp 阅读(219) 评论(0) 编辑 收藏 举报