zoukankan      html  css  js  c++  java
  • 数组优化 Dijkstra 最短路

    //============================================================================
    // Name : POJ.cpp
    // Author :
    // Version :
    // Copyright : Your copyright notice
    // Description : Hello World in C++, Ansi-style
    //============================================================================

    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    #include <algorithm>
    #include <queue>
    #include <vector>
    using namespace std;
    /*
    * 使用优先队列优化Dijkstra算法
    * 复杂度O(ElogE)
    * 注意对vector<Edge>E[MAXN]进行初始化后加边
    */
    const int INF=0x3f3f3f3f;
    const int MAXN=30010;
    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;
    int next;
    };
    Edge edge[200000];
    int tol;
    int head[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=head[u];i!=-1;i=edge[i].next)
    {
    int v=edge[i].v;
    int cost=edge[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)
    {
    edge[tol].v=v;
    edge[tol].cost=w;
    edge[tol].next=head[u];
    head[u]=tol++;
    }

    int main()
    {
    // freopen("in.txt","r",stdin);
    // freopen("out.txt","w",stdout);
    int n,m;
    while(scanf("%d%d",&n,&m)==2)
    {
    tol=0;
    memset(head,-1,sizeof(head));
    int A,B,C;
    while(m--)
    {
    scanf("%d%d%d",&A,&B,&C);
    addedge(A,B,C);
    }
    Dijkstra(n,1);
    printf("%d ",dist[n]);
    }
    return 0;
    }

  • 相关阅读:
    酒店预订管理系统
    毕业论文管理系统
    酒店预订管理系统
    闪屏+引导页
    android编程测试
    测试用例
    ER图
    软件工程作业
    毕业论文管理系统
    酒店管理系统
  • 原文地址:https://www.cnblogs.com/joeylee97/p/6571055.html
Copyright © 2011-2022 走看看