负环
就是求图中负环。。。
洛谷的题中求1到达的负环,WA了好久。。。
主要算法:SPFA
(他又活了 )
1.bfs
bool save()
{
for(int i=1;i<=n;i++)dis[i]=INF,vis[i]=0;
queue<int>q;q.push(1);dis[1]=0;g[1]=0;
while(!q.empty())
{
int u=q.front();q.pop();vis[u]=0;
for(int i=head[u];i;i=nex[i])
{
int v=to[i];
if(dis[v]>dis[u]+val[i])
{
dis[v]=dis[u]+val[i];
g[v]=g[u]+1;if(g[v]>n)return 1;//有负环
if(!vis[v])vis[v]=1,q.push(v);
}
}
}return 0;
}
2.dfs
洛谷可以卡掉,小心使用,但大多数时候更快
bool dfs(int u)
{
vis[u]=1;
for(int i=head[u];i;i=nex[i])
{
int v=to[i];
if(dis[v]>dis[u]+val[i])
{
dis[v]=dis[u]+val[i];
if(vis[v])return 1;
if(dfs(v))return 1;//有负环
}
}vis[u]=0;
return 0;
}
(似乎更短,更好打。。。)