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

来源:互联网 发布:便笺元数据损坏的原因 编辑:程序博客网 时间:2024/06/05 07:10

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

#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;}
0 0