代码:
#include<bits/stdc++.h>
using namespace std;
#define LEN 100005
#define MAX INT_MAX
int n;
int node[LEN];
int next[LEN];
int cost[LEN];
int dijkstra(int start,int end){
/*求一个图中从start到end的最短路径。
n节点数,标号为0,1,2……n-1。
next是邻接表,
node[i]是邻接表的索引,从node[v-1](v=0时,取1)到node[v]-1。
cost是对应的权,cost的值非负。
*/
priority_queue<int> Q;
int include[n];
int mine[n];
memset(include,0,n);
memset(mine,MAX,n);
Q.push(start);
while(!Q.empty()){
int v=Q.top();
Q.pop();
if(include[v]) continue;
include[v]=1;
int a,b;
if(v==0)a=0;
else a=node[v-1];
b=node[v];
for(int i=a;i<b;i++){
if(include[next[i]]) continue;
if(mine[v]+cost[i]<mine[next[i]]){
mine[next[i]]=mine[v]+cost[i];
Q.push(next[i]);
}
}
}
if(mine[end]==MAX) return -1;
else return mine[end];
}