就是直接dfs,然后用 vis[u] 记录每个点的状况,为 1 代表走过了但还没回溯,为 2 代表走过且回溯,然后用 dis[u] 记录当前点到起点的距离,当 vis[v] 为 1 时,就判断 dis[u] - dis[v] + e[i].w < 0,为真就有负环。这是可以的嘛?
void dfs(int u){
for(int i = head[u]; i; i = e[i].next){
int v = e[i].to;
if(vis[v] == 2) continue;
if(vis[v] == 1){
if(dis[u] - dis[v] + e[i].w > 0){
flag = 1;
return;
}
continue;
}
dis[v] = dis[u] + e[i].w;
vis[v] = 1;
dfs(v);
if(flag) return;
}
vis[u] = 2;
}