大概思路就是从第一个点跑dfs并记录下路径权值的和,当遇到一个已经被搜到过的点而且这个点之前记录下的和比现在的大,就认为存在负环。
void solve()
{
int n,m;
cin>>n>>m;
vector<vector<pair<int,int>>> g(n+1);
vector<int> ans(n+1,INF);
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
g[a].push_back({b,c});
if(c>=0) g[b].push_back({a,c});
}
bool flag=0;
auto dfs=[&](auto self,int cur,int sum)->void
{
if(flag) return;
if(ans[cur]!=INF) return void(flag=ans[cur]>sum);
ans[cur]=sum;
for(auto [to,val]:g[cur])
{
self(self,to,sum+val);
}
};
这个代码第二个测试集全过,第一个测试集只过三个。