图结构练习——最短路径->Dijkstra算法--单源最短路

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f;
int vis[1111],dis[1111],a[111][111],n,m;
void Dij(int s)
{
    memset(dis,INF,sizeof(INF));
    for(int i=1; i<=n; i++)
        dis[i]=a[s][i];
    vis[s]=1;           //将当前位置标记
    //dis[s]=0;         //dis数组在当前点的值已经在上面赋值过了,这里可不加
    for(int i=1; i<=n-1; i++)
    {
        int minn=INF;   //找离源点最近的那条路的权值,并用u记录该点
        int u;
        for(int j=1; j<=n; j++)
        {
            if(vis[j]==0&&dis[j]<minn)
            {
                minn=dis[j];
                u=j;
            }
        }
        vis[u]=1;                 //找到后,该点离源点的距离便成为了确定值,并标记
        for(int v=1; v<=n; v++)
        {
            if(a[u][v]<INF&&vis[v]==0)   //这里的标记条件可不加,加上是为了减少复杂度
            {
                dis[v]=min(dis[v],dis[u]+a[u][v]);  //用已有确定值来更新各点
            }
        }
    }
}
int main()
{
    while(cin>>n>>m)
    {
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i==j)
                    a[i][j]=0;
                else
                    a[i][j]=INF;
            }
        }
        for(int i=1; i<=m; i++)
        {
            int u,v,w;
            cin>>u>>v>>w;
            if(a[u][v]>w)    //题目没有明确要求,真是坑我,这是避免覆盖最短路,因为可能有重边
            {
                a[u][v]=w;
                a[v][u]=w;
            }
        }

        Dij(1);
        cout<<dis[n]<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43824158/article/details/86360059
今日推荐