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;
}
}
}
}
}