Dijkstra算法模板

来源:互联网 发布:java时间字符串格式化 编辑:程序博客网 时间:2024/05/18 05:49
#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
*/
原创粉丝点击