dijkstra 算法及其队列优化

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
#define maxn 2999
//dijkstra 算法的优先队列优化
#define inf 999999
struct node
{
    int num,val; //存放结点编号和到初始点的距离
}nod;
priority_queue<node>qq;//优先从小到大
bool operator < (node a,node b)
{
    if(a.val==b.val) return a.num>b.num;
    return a.val>b.val;
}
int book[1000]; //检查这个点是否用过
int dis[100]; //到原点最短距离
int tu[100][100];//记录路径长度 
int n,m;
int main()
{
    int a,b,c;
    while(~scanf("%d%d",&n,&m)) //输入顶点数和边数 
    {
        while(!qq.empty())qq.pop();
        memset(book,0,sizeof(book));
        memset(tu,-1,sizeof(tu));
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            tu[a][b] = tu[b][a] = c;
        }
        for(int i=2;i<=n;i++)
        dis[i] = inf;
        dis[1] = 0;
        nod.num = 1;
        nod.val = 0;
        qq.push(nod);
        while(!qq.empty())
        {
            int t = qq.top().num;
            qq.pop();
            for(int i=2;i<=n;i++)
            {

                if(tu[t][i]!=-1&&dis[i]>dis[t]+tu[t][i])
                {
                    dis[i] = dis[t] +tu[t][i];
                    nod.num = i;
                    nod.val = dis[i];
                    qq.push(nod);
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
        printf("%d ",dis[i]);
        }
    }
    return 0;
}