• Dijkstra 优先队列优化


    #include <iostream>  
    #include <queue>  
    #include <vector>  
    using namespace std;  
    const int N=405;  
    struct rec  
    {  
        int v,w;  
    };  
    vector<rec> edge[N*N];  
    int n,st,ed;  
    __int64 dis[N*N];  
    bool vis[N*N];  
    struct cmp  
    {  
        bool operator()(int a,int b)  
        {   
            return dis[a]>dis[b];  
        }   
    };  
    void Dijkstra()  
    {  
        priority_queue<int,vector<int>,cmp> Q;  //
        memset(dis,-1,sizeof(dis));  
        memset(vis,0,sizeof(vis));  
        int i,u,v;  
        Q.push(st);  
        dis[st]=0;  
        while(!Q.empty())  
        {  
            u=Q.top();  
            Q.pop();  
            vis[u]=0;  
            if(u==ed)  
                break;  
            for(i=0;i<edge[u].size();i++)  
            {  
                v=edge[u][i].v;  
                if(dis[v]==-1 || dis[v]>dis[u]+edge[u][i].w)  
                {  
                    dis[v]=dis[u]+edge[u][i].w;  
                    if(!vis[v])  
                    {  
                        vis[v]=1;  
                        Q.push(v);  
                    }  
                }  
            }  
        }  
    } 
    1
    struct edge {int to,cost;};
    typedef pair<int,int> P; //first是最短距离,second是顶点的编号
    int V;//顶点个数
    vector<edge> G[MAXV];
    int d[MAXV];
    
    void dijkstra(int s)
    {
        priority_queue<P,vector<P>,greater<P> > que;
        memset(d,INF,sizeof d);
        d[s] = 0;
        que.push(P(0,s)); //把起点推入队列
        while(!que.empty())
        {
            P p = que.top(); que.pop();
            int v = p.second; //顶点的编号
            if (d[v] < p.first) continue;
            for(int i = 0; i < G[v].size(); i++)
            {
                edge e = G[v][i];
                if (d[e.to] > d[v] + e.cost)
                {
                    d[e.to] = d[v] + e.cost;
                    que.push(P(d[e.to],e.to));
                }
            }
        }
    }
    2
  • 相关阅读:
    Pandas 学习记录(一)
    python 列表常用操作
    pandas 基本操作
    Numpy np.array 相关常用操作学习笔记
    JS控制背景音乐 没有界面
    Linux Awk使用案例总结
    Yii2 定时任务创建(Console 任务)
    YII2项目常用技能知识总结
    /etc/fstab readyonly 解决办法
    Redis 排行榜 自己简单练习
  • 原文地址:https://www.cnblogs.com/Aragaki/p/7203271.html
Copyright © 2020-2023  润新知