优先队列解决最短路问题

用优先队列解决最短路问题,会将复杂度降低

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#define inf 999999
using namespace std;
struct pp{
    int pos;
    int cost;
    pp(){}
    pp(int xx, int yy):pos(xx), cost(yy){}
    bool operator < (const pp &a) const{
        return cost > a.cost;
    }
};
struct qq{
    int to;
    int val;
    qq(){}
    qq(int xx, int yy):to(xx), val(yy){}
};
priority_queue<pp>mm;
vector<qq>edge[1100];
int n, m, d[1010];
bool vis[1010];
int main(){
    int i;
    while(scanf("%d%d", &m, &n)!=EOF){
        for(i = 1; i <= n; i++)
            edge[i].clear();
        while(!mm.empty()){
            mm.pop();
        }
        memset(vis, 0, sizeof(vis));
        for(i = 1; i <= n; i++)
            d[i] = inf;
        int a, b, c;
        for(i = 1; i <= m; i++){
            scanf("%d%d%d", &a, &b, &c);
            edge[a].push_back(qq(b, c));
            edge[b].push_back(qq(a, c));
        }
        d[1] = 0;
        mm.push(pp(1, 0));
        while(!mm.empty()){
            pp node = mm.top();
            mm.pop();
            if(!vis[node.pos]){
                for(i = 0; i < edge[node.pos].size(); i++){
                    if(d[edge[node.pos][i].to] > d[node.pos] + edge[node.pos][i].val){
                        d[edge[node.pos][i].to] = d[node.pos] + edge[node.pos][i].val;
                        mm.push(pp(edge[node.pos][i].to, d[edge[node.pos][i].to]));
                    }
                }
                vis[node.pos] = 1;
            }
        }
        printf("%d\n", d[n]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值