//spfa算法模板(邻接矩阵):
//c++ code:
void spfa(int s){
for(int i=0; i<=n; i++) dis[i]=99999999; //初始化每点i到s的距离
dis[s]=0; vis[s]=1; q[1]=s; 队列初始化,s为起点
int i, v, head=0, tail=1;
while (head<tail){ 队列非空
head++;
v=q[head]; 取队首元素
vis[v]=0; 释放队首结点,因为这节点可能下次用来松弛其它节点,重新入队
for(i=0; i<=n; i++) 对所有顶点
if (a[v][i]>0 && dis[i]>dis[v]+a[v][i]){
dis[i] = dis[v]+a[v][i]; 修改最短路
if (vis[i]==0){ 如果扩展结点i不在队列中,入队
tail++;
q[tail]=i;
vis[i]=1;
}
}
}
}
转自https://blog.csdn.net/xunalove/article/details/70045815
以上是BFS的spfa算法,可能会超时
DFS spfa
#include <iostream>
using namespace std;
int q[10001], dis[201], a[201][201], b[201][201];
bool vis[201];
int n, m, s, t;
bool flag=false;
void spfa(int s){
if(flag) return;
if(vis[s])//如果有一条边经历过两次就是存在负环
{
flag=true;
return;
}
else vis[s]=1;
for(int i=1; i<=b[s][0]; i++)
if (dis[b[s][i]] > dis[s]+a[s][b[s][i]]){
dis[b[s][i]] = dis[s]+a[s][b[s][i]];
spfa(b[s][i]);
if(flag) return;
}
}
int main(){
int x, y, z,w;
int t;
cin>>t;
while(t--){
flag=false;
cin >> n >> m>> w;
for(int i=0; i<m; i++){
cin >> x >> y >> z;
//if (a[x][y]!=0 && z>a[x][y]) continue;
b[x][0]++; b[x][b[x][0]]=y; a[x][y]=z;
b[y][0]++; b[y][b[y][0]]=x; a[y][x]=z;
}
for(int i=0;i<w;i++)
{
cin >> x >> y >> z;
//if (a[x][y]!=0 && z>a[x][y]) continue;
b[x][0]++; b[x][b[x][0]]=y; a[x][y]=-z;//b[x][0]表示从顶点x出发有多少条边 b[x][b[x][0]]=y 存储的是从x出发的第b[x][0]条边的终点
b[y][0]++; b[y][b[y][0]]=x; a[y][x]=-z;
}
for(int i=0; i<=n; i++) dis[i]=99999999;
dis[1]=0;
spfa(s);
if (flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}