标签:复杂度 一个 避免 inline eof 起点 不同 最短路径 oid
int d[MAXN][MAXN];
void Floyd(){
for(int k = 1; k <= n; ++k){
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= n; ++j){
if(i != j && i != k && j != k)
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
}
}
}
bool vis[N];
queue<int> q;
void SPFA(int s){
memset(dist, 0x3f, sizeof(dist));
d[s] = 0;
q.push(s);
vis[s] = true;
while(!q.empty()){
int u = q.front(); q.pop();
vis[u] = false;
for(int i = head[u]; i; i = edge[i].nxt){
int v = edge[i].v;
int w = edge[i].w;
if(dist[u] + w < d[v]){
d[v] = d[u] + w;
if(!vis[v]){
q.push(v);
vis[v] = true;
}
}
}
}
}
重复上述过程直到所有的点均被访问
当点u的距离更新时,将(dis[u], u)插入堆中,这样堆中可能有多个u,此时取出后面的点时,会发现u已经被访问过不再处理
void Dijkstra(int s){
memset(dist, 0x3f, sizeof(dist));
dist[s] = 0;
q.push(mk(dist[s], s));
while(!q.empty()){
int u = q.top().second;
int d = q.top().first; q.pop();
if(d > dist[u]) continue;
for(int i = head[u]; i; i = edge[i].nxt){
int v = edge[i].v;
int w = edge[i].w;
if(dist[u] + w < dist[v]){
dist[v] = dist[u] + w;
q.push(mk(dist[v], v));
}
}
}
}
标签:复杂度 一个 避免 inline eof 起点 不同 最短路径 oid
原文地址:https://www.cnblogs.com/Adventurer-H/p/11275553.html