#include<iostream>
#include<limits.h>
using namespace std;
int Edge[5][5]={
0,10,INT_MAX,30,100,
INT_MAX,0,50,INT_MAX,
INT_MAX,INT_MAX,0,INT_MAX,10,
INT_MAX,INT_MAX,20,0,6,60,
INT_MAX,INT_MAX,INT_MAX,INT_MAX,0
};//邻接矩阵
int dis[5],flags[5]={1};//V0点进入集合S
void Init_dis(int num);//dis的初始化
int Search_num(int num);//找出不在S集合中到V0的最小值点
int Judge(int num);//判断S是否等于V
int min(int a,int b);//返回较小值
int main()
{
Init_dis(5);
while(Judge(5))
{
int x=Search_num(5);
flags[x]=1;//加入到S集合中
for(int i=0;i<5;i++)
{
if(!flags[i]&&Edge[x][i]!=INT_MAX)//判断x->i的是否可达,并且i不在s集合中
dis[i]=min(dis[i],Edge[x][i]+dis[x]);
}
}
for(int i=0;i<5;i++)
cout<<dis[i]<<endl;
return 0;
}
void Init_dis(int num)//dis的初始化
{
for(int i=0;i<num;i++)
dis[i]=Edge[0][i];//源点到每个顶点的距离
}
int Search_num(int num)//找出不在S集合中到V0的最小值点//
{
int x=0,Min;
for(int i=0;i<num;i++)
if(!flags[i])
{
Min=dis[i];
x=i;
break;
}
for(int i=0;i<num;i++)
{
if(!flags[i]&&dis[i]<Min)
{
x=i;
Min=dis[i];
}
}
return x;
}
int Judge(int num)//判断S是否等于V
{
for(int i=0;i<num;i++)
if(!flags[i])return 1;
return 0;
}
int min(int a,int b)
{
return a<b?a:b;
}
S←{ v0 };
dist[j] ←Edge[0][j], j = 1, 2, …, n-1;
②找出最短路径所对应的点K:
dist[k] == min { dist[i] }, i Î V- S ;
S←S U { k };
③对于每一个i Î V- S 修改:
dist[i] ←min{ dist[i], dist[k] + Edge[k][i] }
④判断:若S = V,则算法结束,否则转②。
原文:http://www.cnblogs.com/zhaoweixiong/p/5047606.html