# 负环判断 ## 题目背景 这次的题目非常模板,单纯的判负环 ## 题目描述 给定一个 $n$ 个点的有向图,判断图中是否存在**从顶点 $1$ 出发能到达**的负环。 负环的定义是:一条边权之和为负数的回路。 ## 输入格式 **本题单测试点有多组测试数据**。 输入的第一行是一个整数 $T$,表示测试数据的组数。对于每组数据的格式如下: 第一行有两个整数,分别表示图的点数 $n$ 和接下来给出边信息的条数 $m$。 接下来 $m$ 行,每行三个整数 $u, v, w$。 - 若 $w \geq 0$,则表示存在一条从 $u$ 至 $v$ 边权为 $w$ 的边,还存在一条从 $v$ 至 $u$ 边权为 $w$ 的边。 - 若 $w < 0$,则只表示存在一条从 $u$ 至 $v$ 边权为 $w$ 的边。 ## 输出格式 对于每组数据,输出一行一个字符串,若所求负环存在,则输出 `YES`,否则输出 `NO`。 ## 样例 #1 ### 样例输入 #1 ``` 2 3 4 1 2 2 1 3 4 2 3 1 3 1 -3 3 3 1 2 3 2 3 4 3 1 -8 ``` ### 样例输出 #1 ``` NO YES ``` ## 提示 #### 数据规模与约定 对于全部的测试点,保证: - $1 \leq n \leq 2 \times 10^3$,$1 \leq m \leq 3 \times 10^3$。 - $1 \leq u, v \leq n$,$-10^4 \leq w \leq 10^4$。 - $1 \leq T \leq 10$。 #### 提示 请注意,$m$ **不是**图的边数。
时间: 2023-09-09 12:05:56 浏览: 75
好的,这是一道关于负环判断的题目。我们可以使用 Bellman-Ford 算法来解决这个问题。具体来说,我们可以对每个点进行 $n-1$ 次松弛操作,其中 $n$ 是图中点的数量。如果在进行这些松弛操作时,还能继续更新某些边的距离,那么就说明存在负环。
具体实现时,我们可以使用一个数组 $dist$ 来记录当前到每个点的最短距离,初始时 $dist[1]=0$,其余为正无穷。然后,我们对每条边 $(u,v,w)$ 进行 $n-1$ 次松弛操作,即 $dist[v]=\min(dist[v], dist[u]+w)$。如果在进行这些操作时,还能继续更新某些边的距离,那么就说明存在负环。
下面是使用 C++ 实现的代码:
阅读全文