最短路径: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 阅读(227) 评论(0) 收藏 举报
浙公网安备 33010602011771号