void dji(int v0){ //v0:初始点
int pos = v0;
for(int i=1;i<=n;i++){
dist[i] = map[v0][i]; //dist[]数组存储各点到初始点的距离
}
vis[pos] = 1; //vis[]数组标记是否已经找到到一个点最短路
for(int i=1;i<n;i++){ //控制查找n-1次
int min = INF; //初始min为一个极大的数INF
for(int j=1;j<=n;j++){ //查找到初始点的最短路
if(vis[j]==0 && dist[j]<min){
pos = j;
min = dist[pos];
}
}
vis[pos] = 1; //pos这个点已经找到最短路,标记
for(int j=1;j<=n;j++){
if(vis[j]==0 && dist[j]>dist[pos]+map[pos][j]){ //j作为中间点(两个点相连要么直接连,要么通过中间点),判断直接连短还是通过其他点短
dist[j] = map[pos][j]+dist[pos];
}
}
}
}
优先队列优化的dijistra:
typedef pair<int,int> P ;
std::vector<P> G[AX];
int dis[AX];
int vis[AX];
int num_road[AX];
void dijstra(){
priority_queue<P,vector<P>,greater<P> >q ; //按照距离从小到达排序
q.push(P(0,1)); // 距离 点
dis[1] = 0 ;
num_road[1] = 1 ;
while( !q.empty() ){
int u = q.top().second;
int val = q.top().first;
q.pop();
if( vis[u] ) continue;
vis[u] = 1 ;
if( val > dis[u] ) continue;
for( int i = 0 ; i < (int)G[u].size() ; i++ ){
int v = G[u][i].first;
int w = G[u][i].second;
if( dis[v] > val + w ){
dis[v] = val + w ;
q.push( P( dis[v] , v ) );
}
}
}
}