对dijkstra算法的一些理解 。
struct edge{
int to,cost;//定义边的目的地与距离
};
typedef pair<int ,int >P;//定义pair为P;
int V;
int d[MAX_V];
vector<edge>G[M];//起始点m到to点的权值即G[M].[i]=e;e.to,e.cost;
void dijkstra(int s){
priority_queue<P,vector<P>,greater<P>>que;//优先队列从小到大排可以对最小元素取出删除;
fill(d,d+n,INF);
d[s]=0;
que.push(P(0,s));//把起始点入队
while(!que.empty()){
P p=que.top();
que.pop();
int v=p.second;
if(d[v]<p.first){
continue;//为了防止同一目的地,进入队列时先大后小的进入,减小复杂度,相当于截枝吧
}
for(int i=0;i<G[v].size();i++){//通过上面把最小顶点确定,继续更新其余点;
edge e=G[v][i];//为了方便写与确定的点的其余点的关系;
if(d[e.to]>d[v]+e.cost){
d[e.to]=d[v]+e.cost;//找到更新的点
que.push+(P(d[e.to],e.to));//把这些点压入队列(压入的点不一定最小距离只是把比原来的值小放入而已,所以对应上面的截枝)
}
}
}
}