不能处理带有负环的图,复杂度稳定O Elogv。
struct edge
{
int v,w;
};
typedef pair<int,int> P; //first是最短距离,second是顶点的编号
int V;//顶点个数
vector<edge> G[MAXV];
int dis[MAXV];
void dijkstra(int s)
{
priority_queue<P,vector<P>,greater<P> > q;
memset(dis,INF,sizeof dis);
dis[s] = 0;
q.push(P(0,s)); //把起点推入队列
while(!q.empty())
{
P p = q.top();
q.pop();
int u = p.second; //顶点的编号
if (dis[u] < p.first) continue;
for(int i = 0; i < G[u].size(); i++)
{
int v = G[u][i].v;
int w = G[u][i].w;
if (dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
que.push(P(dis[v],v));
}
}
}
}