zoukankan      html  css  js  c++  java
  • 【luogu P3371 单源最短路径 】 模板 SPFA优化

    无优化:500ms

    deque优化:400ms

    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int maxn = 550000;
    const int inf = 0x7fffffff;
    int dis[maxn], n, m, s;
    bool vis[maxn];
    deque<int> q;
    struct edge{
        int len, to, from, next;
    }e[maxn<<2];
    int cnt, head[maxn];
    void add(int u, int v, int w)
    {
        e[++cnt].from = u; 
        e[cnt].len = w; 
        e[cnt].next = head[u]; 
        e[cnt].to = v;
        head[u] = cnt;
    }
    void SPFA()
    {
        while(!q.empty())
        {
            int now = q.front(); q.pop_front();
            vis[now] = 0;
            for(int i = head[now]; i != -1; i = e[i].next)
            {
                if(dis[e[i].to] > dis[now] + e[i].len)
                {
                    dis[e[i].to] = dis[now] + e[i].len;
                    if(!vis[e[i].to])
                    {
                        vis[e[i].to] = 1;
                        if(q.empty()||dis[e[i].to] > dis[q.front()])
                        q.push_back(e[i].to);
                        else
                        q.push_front(e[i].to);
                    }
                }
            }
        }
    }
    int main()
    {
        memset(head, -1, sizeof(head));
        scanf("%d%d%d",&n,&m,&s);
        for(int i = 1; i <= n; i++)
        dis[i] = inf;
        for(int i = 1; i <= m; i++)
        {
            int u, v, w;
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
        }
        vis[s] = 1;
        dis[s] = 0;
        q.push_back(s);
        SPFA();
        for(int i = 1; i <= n; i++)
        printf("%d ",dis[i]);
        return 0;
    }
    

    priority_queue优化:300ms

    
    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define ll long long
    using namespace std;
    const ll maxn = 200000 + 10; 
    const ll inf = 2147483647; 
    inline ll read()
    {
        ll k=0,f=1;
        char c=getchar();
        while(!isdigit(c))
        {
            if(c=='-')f=-1;
            c=getchar();
        }
        while(isdigit(c))
        {
            k=(k<<1)+(k<<3)+c-48;
            c=getchar();
        }
        return k*f;
    }
    ll n, m, k, s, end, dis[maxn];
    bool vis[maxn];
    struct edge{
        ll from, len, to, next;
    }e[maxn<<2];
    ll head[maxn], cnt = 0;
    struct cmp{
        bool operator ()(int &x, int &y)
        {
            return dis[x] > dis[y]; 
        }
    };
    priority_queue<int, vector<int>, cmp> q;
    void add(ll u, ll v, ll w)
    {
        e[++cnt].from = u;
        e[cnt].to = v;
        e[cnt].len = w;
        e[cnt].next = head[u];	
        head[u] = cnt;
    }
    void SPFA()
    {
        //memset(dis, 127, sizeof(dis));
        memset(vis, 0, sizeof(vis)); 
        q.push(s);
        dis[s] = 0;
        vis[s] = 1;
        while(!q.empty())
        {
            int now = q.top(); q.pop();
            vis[now] = 0;
            for(ll i = head[now]; i != -1; i = e[i].next)
            {
                if(dis[e[i].to] > dis[now] + e[i].len)
                {
                   dis[e[i].to] = dis[now] + e[i].len;
                   if(vis[e[i].to] == 0)
                   {
                      vis[e[i].to] = 1;
                      q.push(e[i].to);
                   }
                }
            }
        }
    }
    int main()
    {
        memset(head, -1, sizeof(head));
        n = read(); m = read(); s = read();
        for(int i = 1; i <= n; i++) dis[i] = inf;
        for(ll i = 1; i <= m; i++)
        {
            ll u, v, w;
            u = read(); v = read(); w = read();
            add(u, v, w);
        }
        SPFA();
        for(int i = 1; i <= n; i++)
        printf("%lld ",dis[i]);
        return 0;
    }
    
    
  • 相关阅读:
    D365: 笔记(VS无法打开表浏览器)
    D365: 笔记(跟踪调试批处理代码)
    D365: 笔记(非批处理执行class中弹出交互式窗体或报表)
    D365: 笔记(现有量增加批号表字段查询条件)
    D365: 新功能(二)采购发票自动化流程
    D365: 新功能(一)按日期设置编号规则
    ES6 入门教程(未完)
    深入理解TypeScript(未完)
    项目
    vue + threejs 项目踩坑总结
  • 原文地址:https://www.cnblogs.com/MisakaAzusa/p/9332188.html
Copyright © 2011-2022 走看看