原始模板:
时间复杂度O()
使用于图很满的情况
struct Node{
  int y,v;
  Node(int _y,int _v){y=_y;v=_v;}
};
vector<Node> edge[N+1];
int n,m,dist[N+1];
bool b[N+1];
int Dijistra(int s,int t){
  memset(b,false,sizeof(b));
  memset(dist,127,sizeof(dist));
  dist[s]=0;
  for(;;){
    int x=-1;
    for(int i=1;i<=n;i++){
      if(!b[i]&&dist[i]<1<<30)
        if(x==-1||dist[i]<dist[x])
          x=i;
    }
    if(x==t||x==-1)
     break;
    b[x]=true;
    for(auto i:edge[x]){
      dist[i.y]=min(dist[i.y],dist[x]+i.v);
    }
  }
  return dist[t];
} 
优化后版本:
时间复杂度:O( (m+n) * lg n )
适用于图不满的情况
struct Node{
  int y,v;
  Node(int _y,int _v){y=_y;v=_v;}
};
vector<Node> edge[N+1];
int n,m,dist[N+1];
set<pair<int,int>>q;
int Dijistra(int s,int t){
  memset(dist,127,sizeof(dist));
  dist[s]=0;
  for(int i=1;i<=n;i++){
    q.insert({dist[i],i});
  }
  for(;!q.empty();){
    int x=q.begin()->second;
    q.erase(q.begin());
    if(x==t||dist[x]>1<<30)
     break;
    for(auto i:edge[x]){
      if(dist[x]+i.v<dist[i.y])
        q.erase({dist[i.y],i.y});
        dist[i.y]=dist[x]+i.v;
        q.insert({dist[i.y],i.y});
    }
  }
  return dist[t];
}
 



















