Bellman—Ford算法
for(int i=1;i<n;i++) //n个点,不考虑折回,最多走n-1步
for(int j=0;j<m;j++) //遍历所有的边
if(dis[v[i]]<dis[u[i]]+cost)
dis[v[i]]=dis[u[i]]+cost;
题目:Click
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct edge{
int from;
int to;
int cost;
}; //按边存储
const int MAX_E=2801;
edge e[MAX_E*2];
bool negtive_circle(){
int N,M,W;
cin>>N>>M>>W;
int a,b,c;
int i=0;
// 存图
for(i=0;i<M;i++){
cin>>a>>b>>c;
e[2*i].from=a;
e[2*i].to=b;
e[2*i].cost=c;
e[2*i+1].from=b;
e[2*i+1].to=a;
e[2*i+1].cost=c;
}
int j=i*2;
for(int k=0;k<W;j++,k++){
cin>>a>>b>>c;
e[j].from=a;
e[j].to=b;
e[j].cost=-c;
}
//判断
int s=e[0].from; //初始化边为0
int E=j;
vector<int> d(N+1,INT_MAX);//大小为n+1的数组,每个值赋为 INT_MAX
d[s]=0;
for(int v=0;v<N;v++){
for(int i=0;i<E;i++){
edge ee=e[i];
if(d[ee.from]!=INT_MAX&&d[ee.to]>d[ee.from]+ee.cost){
d[ee.to]=d[ee.from]+ee.cost;
if(v==N-1) return true;
}
}
}
return false;
}
int main(){
int f;
cin>>f;
while(f--){
bool res=negtive_circle();
if(res) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}