HDU

题意:N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。A,B,X代表A,B间有一条权值为X的路(0<=A,B<N,A!=B,0<X<10000)
两个整数S,T(0<=S,T<N),分别代表起点和终点。求出从S到T的最短距离,如果数据不存在则输出-1
思路:使用优先队列存储的迪杰斯特拉算法 (模板题)

完整代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
const int inf = 0x3f3f3f3f;
const int max_size =  205;
const int max_edge = 1e3+5;
using namespace std;
typedef pair <int,int> pi;
int head[max_size];
int dist[max_size];
int top,n,m;
struct Edge{
    int u,v,w,next;
}edge[max_edge]; 
void init(){
    memset(head,-1,sizeof(head));
    memset(dist,inf,sizeof(dist));
    top  =0;
}
void add(int a,int b,int c){    
        edge[top].next = head[a];
        edge[top].v = b;
        edge[top].u = a;
        edge[top].w = c;
        head[a] = top;
        top ++;
}
void dijkstra(int s,int e){
    priority_queue<pi> Q;
    Q.push(make_pair(0,s));//自身这一组刚开始为0
    dist[s] = 0;
    while(Q.size()){
        int k = Q.top().second;//找到距离最小的点 
        Q.pop();
        for(int i = head[k];~i;i = edge[i].next){
            if(dist[edge[i].v] > dist[k]+edge[i].w){
                dist[edge[i].v] = dist[k] + edge[i].w;
                Q.push(make_pair(-dist[edge[i].v],edge[i].v));
                //由于queue是默认递增序列,所以每次取top即使取负数最大非负数最小的点 
            }
        }
    }     
}

int main(){
    while(cin>>n>>m){
        init(); 
        for(int i=0;i<m;i++){
            int a,b,c;
            cin>>a>>b>>c;
            add(a,b,c);
            add(b,a,c);
        }
        int s,e;
        cin>>s>>e;
        dijkstra(s,e);
        if(dist[e]!=inf) cout<<dist[e]<<endl;
        else cout<<-1<<endl;
    }
} 
原文地址:https://www.cnblogs.com/Tianwell/p/11281206.html