• (模板)poj2387(dijkstra+优先队列优化模板题)


    题目链接:https://vjudge.net/problem/POJ-2387

    题意:给n个点(<=1000),m条边(<=2000),求结点n到结点1的最短路。

    思路:dijkstra优先队列,复杂度O(nlogn)。

    AC代码:

    #include<cstdio>
    #include<queue>
    #include<algorithm>
    using namespace std;
    
    const int maxn=1e3+5;
    const int inf=0x3f3f3f3f;
    int m,n,cnt,head[maxn],dis[maxn],vis[maxn];
    typedef pair<int,int> PII;
    priority_queue<PII,vector<PII>,greater<PII> > pq;
    
    struct node{
        int v,w,nex;
    }edge[maxn<<2];
    
    void adde(int u,int v,int w){
        edge[++cnt].v=v;
        edge[cnt].w=w;
        edge[cnt].nex=head[u];
        head[u]=cnt;
    }
    
    void dijkstra(){
        pq.push(make_pair(0,n));
        for(int i=1;i<=n;++i)
            dis[i]=inf;
        dis[n]=0;
        int num=0;
        while(!pq.empty()&&num<=n){
            int d=pq.top().first,u=pq.top().second;
            pq.pop();
            if(vis[u]) continue;
            vis[u]=1;
            ++num;
            for(int i=head[u];i;i=edge[i].nex){
                int v=edge[i].v,w=edge[i].w;
                if(!vis[v]&&dis[v]>dis[u]+w){
                    dis[v]=dis[u]+w;
                    pq.push(make_pair(dis[v],v));
                }
            }
        }
    }
    
    int main(){
        scanf("%d%d",&m,&n);
        for(int i=1;i<=m;++i){
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            adde(u,v,w);
            adde(v,u,w);
        }
        dijkstra();
        printf("%d
    ",dis[1]);
        return 0;
    }
  • 相关阅读:
    数组
    做了个进制转换图
    类的练习
    3.10l练习
    c#学习第二课
    c#第四课习题
    c#学习第三课
    学习PHP&MYSQL之——字符编码篇(一)
    中缀表达式转换成后缀表达式
    模板方法模式(Template Pattern)
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/11722634.html
Copyright © 2020-2023  润新知