//Dijkstra[priority_queue优化]
struct edge {int to,cost;}; //终点,边权
vector G[MAXV]; //邻接表存地图
typedef pair P; //first最短距离,second顶点编号
int d[MAXV], V; //距起点到当前顶点的距离
void dijkstra(int s){ //传入起点S
priority_queue,greater
> que;//开优先队列
memset(d,INF,sizeof d); //初始化
d[s] = 0; //起点到起点距离0
que.push(P(0,s)); //把起点推入队列
while(!que.empty()){ //队列非空
P p=que.top();que.pop();//读出队首并弹出
int v=p.second; //顶点的编号
if(d[v]
d[v]+e.cost){ //如果可以松驰
d[e.to]=d[v]+e.cost; //就更新最小距离
que.push(P(d[e.to],e.to)); //然后把新插入的点打入队列
}
}
}
}
/***
说明:
邻接矩阵实现dijkstra算法复杂度是O(V²)。需要优化的是数值的插入(更新)和取出最小值两个操作
不枚举的话插入与最小都是从头到尾扫一次,而代码中使用堆降到O(ElogV)
***/