堆优化Dijkstra
每次取出一个离起点最近的店进行松弛操作
struct edge{
int u,w,next;
}e[maxm];
struct node{
int d,u;
bool operator < (const node& r) const {
return d>r.d;
}
};
int cnt=0,n,m,s;
int head[maxn];
bool vis[maxn];
int dis[maxn];
void add(int a,int b,int c){
cnt++;
e[cnt].u=b;
e[cnt].w=c;
e[cnt].next=head[a];
head[a]=cnt;
}
void dijkstra(){
priority_queue<node>q;
int cur=s;
dis[s]=0;;
q.push((node){0,s});
while(!q.empty()){
node x=q.top();
q.pop();
cur=x.u;
if(vis[cur])continue;
vis[cur]=true;
for(int i=head[cur];i!=0;i=e[i].next)
if(!vis[e[i].u]){
dis[e[i].u]=min(dis[e[i].u],dis[cur]+e[i].w);
q.push((node){dis[e[i].u],e[i].u});
}
}
}