spfa
之前说这个spfa已经死了,但是今天看到一道题去维护变量之间额大小关系,第一想法是并查集,但是好像并查集并不可以维护查分约束的条件,所以我看了看题解,发现是我认为已经死了的spfa
(
思想
还是松弛,还是松弛,还是松弛,其实就是一个优化的bellman ford,本质上就是bfs去找点,只要dis大就去松弛,之后看看这个点在不在队列里,如果不在就加入队列,之后一波操作完成之后就可以的到单元最短路,其实还是很easy的
上代码
void spfa(int x){
dis[x]=0;
vis[x]=true;
queue<int>q;
q.push(q);
while(!q.empty()){
int g=q.front();
q.pop();
vis[g]=flase;
for(int i=head[g];i;i=nex[i]){
if(dis[to[i]]>dis[g]+val[i]){
dis[to[i]]=dis[g]+val[i];
if(!vis[to[i]]){
q.push(to[i]);
vis[to[i]]=true;
}
}
}
}
}
用处----判断负环
其实这个判断主要还是在维护查分约束条件的时候去用,有些时候tarjan去找负环也是可以的而且快。
找负环的思想其实就是,可以发现,假如有负环那么是不是就会一直在这里刷最小路,所以每一个点会进入队列很多次,在没有负环的时候最多是n次,那么在这里就是只要进入了n+1次,就说明有负环
代码就是改动一下下就好
void spfa(int x){
queue<int>q;
q.push(x