迪杰斯特拉代码部分及要注意的部分

#include<iostream>
#include<cstdio>
#include<string.h>
#define inf 0x3f3f3f
using namespace std;
void dijkstra();
int p[101][101];
int dis[101];
int vis[101];
int n,m;
void init()
{
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
    {
        p[i][j]=p[j][i]=inf;   //注意一开始各点之间距离要初始化为无穷大
    }
    memset(vis,0,sizeof(vis));

}
int main()
{

    while(scanf("%d%d",&n,&m),m+n)
    {
        int i;
        init();
        for(i=0;i<m;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            p[a][b]=c;
            p[b][a]=c;
        }
        dijkstra();
        cout<<dis[n]<<endl;
    }
}
void dijkstra()
{
    int i;
    for(i=1;i<=n;i++)
        dis[i]=inf;     //最短距离数组也要初始化为最大
    dis[1]=0;    //起点最短距离为1,不用管和起点直接连接的点的存储,和其他点的存储方式没区别,都在下面遍历所有点找距离更小的那个过程中
    int u;      //有一个找最近点的变量
    for(i=1;i<=n;i++)      //注意是两重循环,第一层保证先遍历所有的点,第二层再遍历找最近的和更新距离值
    {
        u=-1;      //一开始没有最近点,就随便找一个,以便后续比较
        int j;
        for(j=1;j<=n;j++)
        if(!vis[j]&&(u==-1||dis[j]<dis[u]))
            u=j;
        vis[u]=1;
        for(j=1;j<=n;j++)
            if(!vis[j]&&dis[j]>dis[u]+p[u][j])
            dis[j]=dis[u]+p[u][j];
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42165786/article/details/81385088