(模板)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;
}
原文地址:https://www.cnblogs.com/FrankChen831X/p/11722634.html