优先队列解决最短路问题

来源:互联网 发布:三星手机数据更新 编辑:程序博客网 时间:2024/06/15 23:50

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

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>#define inf 999999using 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;}


0 0
原创粉丝点击