您的位置:首页 > 职场人生

程序员必须掌握的十种算法---Dijkstra算法

2015-08-18 10:36 676 查看
由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出的使用了广度优先搜索解决非负权有向图的单源最短路径问题。

#include<stdio.h>
int main()
{
/*
*e存储图的矩阵表示
*dis存储1号顶点到其余各个顶点的距离
*book表示各个顶点是否已经找到最小距离
*/
int e[10][10],dis[10],book[10],i,j,n,m,t1,t2,t3,u,v,min;

int inf=99999999;//用inf(infinity)存储一个我们认为的正无穷的值

//读入n,m,n表示顶点个数,m表示边的条数
scanf("%d %d",&n,&m);

//初始化
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;
}
}

//读入边
for(i=1;i<=n;i++)
{
scanf("%d %d %d",&t1,&t2,&t3);
e[t1][t2]=t3;
}

//初始化dis数组,这里是1号顶点到其余各个顶点的初始化路程
for(i=1;i<=n;i++)
dis[i]=e[1][i];

//book数组初始化
for(i=1;i<=n;i++)
book[i]=0;
book[1]=1;

//Dijkstra算法的核心语句
for(i=1;i<=n-1;i++)
{
//找到离1号顶点最近的顶点
min=inf;
for(j=1;j<=n;j++)
{
if(book[j]==0&&dis[j]<min)
{
min=dis[j];//min存储这个最小的距离
u=j;//u表示最近的顶点是哪个顶点
}
}

book[u]=1;
for(v=1;v<=n;v++)
{
//查看顶点u到顶点v是否连通
if(e[u][v]<inf)
{
if(dis[v]>dis[u]+e[u][v])
dis[v]=dis[u]+e[u][v];
}
}
}

//输出最终结果
for(i=1;i<=n;i++)
{
printf("%d ",dis[i]);
}

getchar();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法