//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; }