首先是Dijkstra算法,Dijkstra算法适用于边权为正的情况,它可用于计算正权图上的单源最短路,即从单个源点出发,到所有结点的最短路,该算法同时适用于有向图和无向图。给出代码的时间复杂度为O(mlogn),m为边的数目,n为点的数目。
struct Edge{
int from,to,dist; //从点from到to点距离dist
Edge(int u,int v,int d):from(u),to(v),dist(d){} //初始化边
};
struct HeapNode{
int d,u; //d为从s点到u点的的距离
bool operator < (const HeapNode& rhs) const{
return d > rhs.d; //定义最小堆
}
};
//把该算法用到的数据结构封装到一个结构体中
struct Dijkstra{
int n,m;
vector<Edge> edges;
vector<int> G[maxn];
bool done[maxn]; //是否已永久标号
int d[maxn]; //s到各个点的距离
int p[maxn]; //最短路中的上一条弧
//初始化
void init(int n){
this -> n = n;
for(int i = 0; i < n; i++){
G[i].clear();
}
edges.clear();
}
//添加边
void AddEdge(int from,int to,int dist){
edges.push_back(Edge(from,to,dist));
m = edges.size();
G[from].push_back(m - 1);
}
//主体算法
void dijkstra(int s){
priority_queue<