迪杰斯特拉算法(Dijkstra's Algorithm)
解决单源最短路问题的优秀算法,堆优化后时间复杂度降到O((m+n)logn)。
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#define FOR(i,x,y) for(int i=(x);i<=(y);i++)
#define DOR(i,x,y) for(int i=(x);i>=(y);i--)
#define N 10003
#define M 500003
#define INF 2147483647
using namespace std;
int n,m;
int dis[N];
struct edge
{
int to,cost;
};
vector<edge>E[N]; //这里以邻接表为例
struct node
{ //走到at节点的最短路为path
int at,path;
bool operator<(const node &_)const
{
return path>_.path; //path小的先出
}
};
void dijkstra(int s)
{
FOR(i,1,n)dis[i]=INF;
dis[s]=0;
priority_queue<node>q;
while(!q.empty())q.pop(); //使用前测试STL是好习惯
q.push((node){s,0}); //把起点先加入队列
while(!q.empty())
{
node now=q.top();q.pop(); //取距离最小的节点