dijkstra 算法是非常常用的最短路算法,所以它的效率至关重要;
这里采用vector进行图的存储,概念比较简单易懂,同时效率也还可观;
struct Edge
{
int from;//出发结点
int to;//终止结点
int dist;//距离
Edge(int u,int v,int d):from(u),to(v),dist(d){}
};
struct HeapNode
{
int d,u;//d为距离,u为起始结点
//重载运算符
bool operator < (const HeapNode& rhs) const
{
return d>rhs.d;
}
};
struct Dijkstra
{
int n;//n为结点数
int m;//m为边的编号
vector<Edge> edges;
vector<int> G[maxn];
bool done[maxn];//是否已经标记过
int d[maxn];//源点到各个点的距离
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();