zoukankan      html  css  js  c++  java
  • Dijkstra(单队优化)

    主要是存个板子

    时间复杂度O(e loge),比朴素的快多了。

    #include<bits/stdc++.h>
    using namespace std;
     
    const int INF=0x3f3f3f3f;
    const int MAXN=1000010;
     
    struct qnode
    {
        int v;
        int c;
        qnode(int _v=0,int _c=0):v(_v),c(_c){}
        bool operator <(const qnode &r)const
        {
            return c>r.c;
        }
    };
     
    struct Edge
    {
        int v,cost;
        Edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
    };
     
    vector<Edge> E[MAXN];
    bool vis[MAXN];
    int dist[MAXN];
     
    void Dijkstra(int n,int start)//点的编号从1开始
    {
        memset(vis,false,sizeof(vis));
        for(int i=1;i<=n;i++) dist[i]=INF;
        priority_queue<qnode> que;
        while(!que.empty()) que.pop();
        dist[start]=0;
        que.push(qnode(start,0));
        qnode tmp;
        while(!que.empty())
        {
            tmp=que.top();
            que.pop();
            int u=tmp.v;
            if(vis[u]) continue;
            vis[u]=true;
            for(int i=0;i<E[u].size();i++)
            {
                int v=E[tmp.v][i].v;
                int cost=E[u][i].cost;
                if(!vis[v]&&dist[v]>dist[u]+cost)
                {
                    dist[v]=dist[u]+cost;
                    que.push(qnode(v,dist[v]));
                }
            }
        }
    }
     
    void addedge(int u,int v,int w)
    {
        E[u].push_back(Edge(v,w));
    }
     
    int main()
    {
        for(int i=0;i<=MAXN;i++)
            if(!E[i].empty())
                E[i].clear();
        freopen("in.txt","r",stdin);
        int n;
        cin>>n;
        int e;
        cin>>e;
        int u,v,w;
        for(int i=1;i<=e;i++)
        {
            cin>>u>>v>>w;
            addedge(u,v,w);
        }
        Dijkstra(n,1);
        for(int i=1;i<=n;i++)
            cout<<dist[i]<<" ";
        cout<<endl;
        return 0;
    }

     存边的时候还是用vector吧!自己打的前向星不知道为啥会超时,难道是边界哪里越了嘛。。。

  • 相关阅读:
    使用推荐使用的映射器和适配器
    第一个SpringMVC的注解应用
    简化SpringMVC配置
    第一个SpringMVC程序
    ettercap
    hashcat
    二维数组实现checkbox的分组多选
    安装 slowhttptest ddos攻击软件
    转载:windows的mysql提权方式
    windows c dll的创建与调用
  • 原文地址:https://www.cnblogs.com/yyys-/p/11172816.html
Copyright © 2011-2022 走看看