检测负权环的问题
用BF算法即可,即每次看能不能更新距离,如果都没有更新,说明算法达到了顶点,直接跳出
出了一次bug调了好久...进行了开数组,优化代码,看了好几次...
你猜?没错!就是YES写成了Yes!wdnmd...
#include<iostream>
using namespace std;
int F, N, M, W;
int dist[10001], u[10001], v[10001],t[10001];
int old_dist[10000];//用于看算法是否有改善,提前停止
const int inf = 999999999;
int main()
{
cin >> F;
while (F--)
{
cin >> N >> M >> W;
for (int i = 0; i < M; i++)
{
cin >> u[i] >> v[i] >> t[i];
}
for (int i = M; i < M + W; i++)
{
cin >> u[i] >> v[i] >> t[i];
t[i] = -t[i];//反向边
}
//下面用BF寻找负权环
for (int i = 0; i < N; i++)
{
dist[i] = inf;
}
dist[0] = 0;
for (int lp = 1; lp < N; lp++)
{
for (int i = 0; i < N; i++)
{
old_dist[i] = dist[i];
}
for (int i = 0; i < M; i++)//此乃双向
{
if (dist[u[i]] > dist[v[i]] + t[i])
{
dist[u[i]] = dist[v[i]] + t[i];
}
if (dist[v[i]] > dist[u[i]] + t[i])
{
dist[v[i]] = dist[u[i]] + t[i];
}
}
for (int i = M; i < M + W; i++)
{
if (dist[v[i]] > dist[u[i]] + t[i])//v~u为正方向的
{
dist[v[i]] = dist[u[i]] + t[i];
}
}
bool better = false;
for (int i = 0; i < N; i++)
{
if (old_dist[i] != dist[i])
{
better = true;
break;
}
}
if (!better)
{
break;
}
}
bool find = false;
for (int i = 0; i < M; i++)//只需要检查M
{
if (dist[v[i]] > dist[u[i]] + t[i])//如果还优化了
{
find = true;
break;
}
}
if (find)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}