HDU2544(Dijkstra优先队列优化版)

来源:互联网 发布:全职猎人 知乎 编辑:程序博客网 时间:2024/06/03 10:54

虽然没有怎么看懂,时间复杂度从n的平方到了mlogn,应该还可以继续优化,抛掉已经访问的点,我还没想明白。

#include<iostream>using namespace std;#include<queue>#include<vector>const int Ni = 10010;const int INF = 1 << 27;struct node{    int x, d;    node(){}    node(int a, int b)    {        x = a;        d = b;    }    bool operator<(const node &a)const    {        if (d == a.d)            return x < a.x;        else            return d > a.d;    }};vector<node>eg[Ni];int dis[Ni], n;void dijkstra(int s){    int i;    for (i = 0; i <= n; i++)        dis[i] = INF;    dis[s] = 0;    priority_queue<node>q;    q.push(node(s, dis[s]));    while (!q.empty())    {        node x = q.top();        q.pop();        for (i = 0; i < eg[x.x].size(); i++)        {            node y = eg[x.x][i];            if (dis[y.x] > x.d + y.d)            {                dis[y.x] = x.d + y.d;                q.push(node(y.x, dis[y.x]));            }        }    }}int main(){    int a, b, d, m;    while (cin >> n >> m&&n + m)    {        int s, e;        for (int i = 0; i <= n; i++)            eg[i].clear();        while (m--)        {            cin >> a >> b >> d;            eg[a].push_back(node(b, d));            eg[b].push_back(node(a, d));        }        dijkstra(1);        cout << dis[n] << endl;    }    return 0;}