1.jsk精辟解析
2.记录最优路径
int prv[N], pree[N]; int dis[N]; bool in[N]; inline void Init() { memset(dis, 0x3f, sizeof(dis)); memset(in, false, sizeof(in)); } void SpfaFirst() { Init(); memset(prv, -1, sizeof(prv)); queue<int> q; q.push(1); dis[1] = 0; in[1] = true; int u; while(!q.empty()) { u = q.front(); q.pop(); in[u] = false; for(int i = p[u]; ~i; i = e[i].next) { int v = e[i].v, w = e[i].w; if(dis[u]+w < dis[v]) { //cout << dis[v] << " dw: "<<dw<<endl; dis[v] = dis[u]+w; prv[v] = u; pree[v] = i; if(!in[v]) { q.push(v); in[v] = true; } } } } }
3.普通spfa
int dis[N]; bool in[N]; inline void Init() { memset(dis, 0x3f, sizeof(dis)); memset(in, false, sizeof(in)); } void Spfa() { Init(); queue<int> q; q.push(1); dis[1] = 0; in[1] = true; int u; while(!q.empty()) { u = q.front(); q.pop(); in[u] = false; for(int i = p[u]; ~i; i = e[i].next) { int v = e[i].v, w = e[i].w; if(dis[u]+w < dis[v]) { //cout << dis[v] << " dw: "<<dw<<endl; dis[v] = dis[u]+w; if(!in[v]) { q.push(v); in[v] = true; } } } } }