算法纲要:
1·找到一个Source。初始化距离为无穷大,d[0]=0。
2·头指针指向source
3·更新所有和它相连的点的距离为W(s,i);
4·head++,重复3;直到没有未访问的节点

Code
#include "stdio.h"
int n,visit[10]={},link[10][10],queue[10]={},head=0,d[11]={},tail;
int find()
{
/*搜索函数,主要目的是找到最短点*/
int i,min=10;
for(i=0;i<n;i++){if(d[queue[i]]<d[min])min=i;}
queue[min]=10;/*等于销毁这个点*/
tail--;
return min;
}
void relax(int a,int b)
{
d[b]=d[b]>d[a]+link[a][b]?d[a]+link[a][b]:d[b];//松弛函数,此乃关键!
}
void dij()
{
int i,j;
for(i=0;i<n;i++){queue[i]=i;}
while(tail!=0)
{
j=find();
visit[j]=1;
head++;
for(i=0;i<n;i++)if(link[j][i]!=0)relax(j,i);//主函数
}
}
int main()
{
int a,b,c;
scanf("%d",&n);
for(a=0;a<n;a++)
d[a]=32767;
d[0]=0;
d[10]=32767;
tail=n;
for(;;)
{
scanf("%d%d%d",&a,&b,&c);
if(a==-1)break;
link[a][b]=c;
}
dij();
for(a=0;a<n;a++)
printf("%d--->%d\n",a,d[a]);
return 0;
}