• Dijkstra算法


    2017-07-26 22:30:45

    writer:pprp

    dijkstra算法法则:设置顶点集合S,首先将起始点加入该集合,然后根据起始点到其他顶点的路径长度,

    选择路径长度最小的顶点加入到集合S,根据所加入顶点更新源点到其他顶点的路径长度,然后再选取最小边的顶点;

    实现:用邻接矩阵

    适用条件:图中任意一个边都是正的

    我的理解:从某一点出发,找到与该点临近有路径的点,找到其中最短路径的点,将其标记,表示已经访问过了,

    然后更新距离的数组(如果通过两步路径和要比一步的路要短),还需要在深刻理解一下;


    代码如下:

    #include <iostream>
    
    using namespace std;
    
    const int INF = 99999999;
    int n;
    int map[1001][1001];  //储存图
    int visit[1001] = {0};   //设置访问标记
    int d[1001];    //源点到各节点的最小距离
    
    
    void init()
    {
        cin >> n;
        for(int i = 1; i <= n ; i++)
            for(int j = 1; j <= n ; j++)
            {
                cin >> map[i][j];
                if(map[i][j] == 0)
                    map[i][j] = INF;
            }
    }
    
    void Dijkstra(int x)  //从x点开始到其他源点的距离
    {
        int i,j,Min,p;
        for(i =1; i<=n; i++)
            d[i] = map[x][i];  //初始化最小距离
        visit[x] = 1;    //标记为已访问过
        d[x] = 0;       //自身到自身为0
        for(i = 1; i < n; i++)
        {
            Min = INF;            //找最小边
            for(j = 1; j<=n; j++)  //找出总和最短路径
            {
                if(!visit[j]&&Min>d[j])
                {
                    p = j;
                    Min = d[j];
                }
            }
            visit[p] = 1;
            for(j = 1; j <= n; j++)
            {
                if(!visit[j]&&Min+map[p][j]<d[j])
                    d[j] = Min+map[p][j];
            }
        }
        for(i = 1;i <= n ;i++)
          cout <<d[i]<<" ";
        cout << endl;
    }
    
    int main()
    {
        init();
        Dijkstra(1);
        return 0;
    }
  • 相关阅读:
    关于JEE web项目 Servlet中 “/” 的解释 ;
    通过session 怎么防止表单的重复提交!
    Struts hibernate Spring 框架原理
    apache DBUtils 使用例子demo
    二十三种设计模式通俗理解
    怎样将一个脚本添加到开机自启动中
    zabbix
    数据库
    nginx服务器
    Luogu P3398 仓鼠找sugar
  • 原文地址:https://www.cnblogs.com/pprp/p/7242456.html
Copyright © 2020-2023  润新知