您的位置:首页 > 其它

Dijkstra算法模板

2017-05-24 19:12 197 查看
#include <stdio.h>

int main()

{

    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<=m;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)//  找最小的,等于0是没录进来

            {

                min=dis[j];

                u=j;

            }

        }

        book[u]=1;

        for(j=1;j<=n;j++)

        {

            if(e[u][j]<inf)//有路

            {

                if(dis[j]>dis[u]+e[u][j])

                    dis[j]=dis[u]+e[u][j];

            }

        }

    }

    //输出最终的结果

    for(i=1;i<=n;i++)

        printf("%d ",dis[i]);

    //getchar();

    //getchar();

    return 0;

}/*

6 9

1 2 1

1 3 12

2 3 9

2 4 3

3 5 5

4 3 4

4 5 13

4 6 15

5 6 4

0 1 8 4 13 17

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