算法基础之迪杰斯特拉求最短路I

迪杰斯特拉求最短路I

  • 核心思想:迪杰斯特拉算法

  • 稠密图:用邻接矩阵存

  • 稀疏图:用邻接表存

    •   #include
        #include
        #include
        
        using namespace std;
        
        const int N=510;
        int n,m;
        int g[N][N];  //邻接矩阵
        int d[N];
        bool st[N];
        
        int dijkstra()
        {
            memset(dis,0x3f,sizeof dis);  //每个点距离起点的距离初始化无穷大
            dis[1] = 0;  //起点距离0 
            for(int i=0;i<n;i++)  //找出不在s集合并且 没更新过/距离最短的点 加入s集合
            {
                int t = -1;  //找点
                for(int j=1;j<=n;j++)  //遍历所有点
                {  //第一次时 参与的是起点 dis最后赋值 第二次时 dis已经赋值
                    if(!st[j] && (t==-1 || dis[t] > dis[j]))  //j没加入s集合 并且 距离起点更近 或者没更新过
                    { 
                        t=j;  //保存j的值
                    }
                }
                
                st[t] = true;  //标记加入s集合
                
                for(int j=1;j<=n;j++)  //根据加入的点 更新其他的点的距离dis
                {  
                    dis[j] = min(dis[j],dis[t] + g[t][j]);
                }
            }
            
            if (dis[n] == 0x3f3f3f3f) return -1;  //距离没改变
            return dis[n];
        }
        
        int main()
        {
            cin>>n>>m;
            memset(g, 0x3f , sizeof(g));
            
            while(m--)
            {
                int a,b,c;
                cin>>a>>b>>c;
                g[a][b] = min(g[a][b],c);
            }
            
            cout<<dijkstra()<<endl;
            return 0;
        }
      

你可能感兴趣的:(算法,图论,数据结构,深度优先,c++)