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;
}