• 用vector实现dijkstra


    #include <stdio.h>
    #include <string.h>
    #include <string>
    #include <vector>
    #include <algorithm>
    #define INF 0x3f3f3f3f
    
    using namespace std;
    
    struct node
    {
        int end;//终点
        int power;//权值
    } t;
    
    int n;//n为边数
    vector<node>q[500001];//邻接表存储图的信息
    int dis[500001];//距离数组
    bool vis[500001];//标记数组
    
    void Dijkstra(int start, int end)
    {
        memset(vis, false, sizeof(vis));
        for(int i=0; i<=n; i++)
        {
            dis[i] = INF;
        }
        int len=q[start].size();
        for(int i=0; i<len; i++)
        {
            if(q[start][i].power < dis[q[start][i].end] )
                dis[q[start][i].end]=q[start][i].power; //从起点开始的dis数组更新
        }
    
        vis[start]=true;//起点标记为1
    
        for(int k=0; k<n-1; k++)
        {
            int pos, min=INF;
            for(int i=1; i<=n; i++)
            {
                if( !vis[i] && dis[i]<min )
                {
                    //当前节点未被访问过且权值较小
                    min=dis[i];
                    pos=i;
                }
            }
    
            vis[pos]=true;
    
            //再次更新dis数组
            len=q[pos].size();
            for(int j=0; j<len; j++)
            {
                if( !vis[q[pos][j].end] && dis[ q[pos][j].end ]>q[pos][j].power+dis[pos] )
                    dis[q[pos][j].end ] = q[pos][j].power + dis[pos];
            }
        }
        printf("%d
    ", dis[end] );
    }
    
    
    int main()
    {
        int m;
        while(scanf("%d %d", &n, &m)&&n&&m)//输入点和边
        {
            for(int i=0; i<=n; i++)
                q[i].clear();//将vector数组清空
            for(int i=0; i<m; i++)
            {
                int begin,end, power;
                scanf("%d %d %d", &begin, &end, &power);//输入
                /*t作为node型临时变量,为了方便压入,以下代码为无向图的输入边*/
                t.end=end;
                t.power=power;
                q[begin].push_back(t);
                t.end=begin;
                t.power=power;
                q[end].push_back(t);
            }
            //Dijkstra(1, n);
            int start, end;//自己确定起始点和终止点
            scanf("%d %d", &start, &end);//输入起始点和终止点
            Dijkstra(start, end);
        }
        return 0;
    }
  • 相关阅读:
    堆的实现(图片演示+文字讲解)
    数据结构之堆的插入、取值、排序(细致讲解+图片演示)
    插入排序
    (简单易懂)Java的快速失败(fail-fast)与安全失败,源码分析+详细讲解
    Eclipse安装Hibernate插件快速生成配置文件
    Hibernate级联操作解密(inverse和cascade)
    http协议详解
    javaweb中的关于编码问题总结
    Hyperparameter tuning
    win10修改jupyter notebook默认路径
  • 原文地址:https://www.cnblogs.com/aiguona/p/7229189.html
Copyright © 2020-2023  润新知