bool spfa(int s)
{
memset(cnt, 0, sizeof(cnt));
memset(d, 0x3f, sizeof(d));
memset(vis, 0, sizeof(vis));
queue <int> q;
q.push(s);
vis[s] = true;
cnt[s]++;
d[s] = 0;
while (!q.empty())
{
int temp = q.front();
q.pop();
vis[temp] = false;
for (int i = 0; i<edge[temp].size(); i++)
{
if (d[temp] + edge[temp][i].weight < d[edge[temp][i].vertex])//此处应格外注意 i 只是编号,存储的节点编号为 edge[temp][i].vertex
{
d[edge[temp][i].vertex] = d[temp] + edge[temp][i].weight;
if (!vis[edge[temp][i].vertex])//松弛操作过后,如果这个点不在队列,就让他入队
{
q.push(edge[temp][i].vertex);
vis[edge[temp][i].vertex] = true;
cnt[edge[temp][i].vertex]++;
if (cnt[edge[temp][i].vertex] > n)//如果某一个点入队超过节点总数的次数,那么形成了负环
{
return false;//函数返回 失败
}
}
}
}
}
return true;
}
以上的算法没有进行两种优化,不过复杂度暂时可以接受,等等去优化一下
代码长度更加爆炸了。。
NOIP - 220 天