void Dijkstra(int st){
memset(conf,0,sizeof(conf));
conf[st]=1;//标记除起点外所有点的最短路都未确定
for(int i=1;i<=mc;i++)
dis[i]=a[i][st];
dis[st]=0;//起点到起点为0
for(int i=1;i<=mc;i++){
int tempmin=INF;
int aim=st;
for(int j=0;j<=mc;j++)// 找出当前未确定的点j的dis[j]最小值
if(!conf[j]&&dis[j]<tempmin){
aim=j;//aim为当前邻接点中距离最小的点
tempmin=dis[j];
}
conf[aim]=1;
for(int j=1;j<=mc;j++){//松弛操作,通过新加入的点的路径找到离st点更短的路径
if(!conf[j]&&a[aim][j]!=INF&&dis[aim]+a[aim][j]<dis[j])
dis[j]=dis[aim]+a[aim][j];
}
}
return ;
}
堆优化
void dijkstra(int st){
for(int i=0;i<MAXN;i++){
dis[i]=INF;
vis[i]=0;
}
dis[st]=0;
priority_queue <int> a;
int e;
a.push(0);
int v;
while(!a.empty()){
e=a.top();
a.pop();
vis[e]=0;
for(int i=0;i<edge[e].size();i++){
v=edge[e][i].v;
if(dis[v]==INF||dis[v]>dis[e]+edge[e][i].w){
dis[v]=dis[e]+edge[e][i].w;
if(!vis[v]){
vis[v]=1;
a.push(v);
}
}
}
}
}