1.Dijkstra算法(适用于边权为正的图)
(1)概述:该算法可以计算正权图的单源最短路,即从一个单个源点出发,到所有结点的最短路。伪代码如下:
清除所有点的标号
设d[0]=0,其他d[i]=INF
循环n次
{
在所有未标号的结点中,选出d值最小的结点x
给结点x标记
对于从x出发的所有边(x,y),更新d[y]=min{d[y],d[x]+w(x,y)}
}
下面给出优化到O(M*logN)的代码
#define N 10000
#define INF 1000000
struct Edge
{
int from,to,dist;
Edge(int u, int v, int d) :from(u), to(v), dist(d){}
};
struct HeapNode//将d值,编号捆绑为一个结构体
{
int d, u;
HeapNode(int dd, int uu) :d(dd), u(uu){};
bool operator <(const HeapNode&rhs)const
{
return d>rhs.d;
}
};
struct Dijkstra
{
int n, m;
vector<Edge>edges;
vector<int>G[N];
bool done[N];//是否已经永久标记
int d[N]; //s到各个点的距离
int p[N]; //最短路中的上一条边
void init()//初始化
{
this->n