Bellman_ford或spfa 判断图是否存在负环

来源:互联网 发布:c语言二叉查找树 编辑:程序博客网 时间:2024/05/01 13:18
/*判断负环的两种方法:Spfa思想:如果存在一个点进入队列的次数超过N次,则存在负环。bellman_ford思想:对所有的边进行v-1 松弛即如果 dis[u]+map[u][v] < dis[v] 则 dis[v] = dis[u]+map[u][v]  若v-1次松弛之后还能进行松弛,说明原图存在负环。复杂度 0(VE)*///bellman_ford判断#include <iostream>using namespace std;const int MAXN = 1000;int map[MAXN][MAXN];int dis[MAXN];int front[MAXN];struct Edge{int s;int e;}e[MAXN*MAXN];//如果返回-1,则表示有负环。 否则返回dis[end]//起点,终点,n个点,m条边. 顶点编号1,2...nint bellman_ford(int start, int end, int n, int m){memset(dis,0x7f,sizeof(dis)); //初始化无穷大dis[start] = 0;for(int i=0; i<n-1; i++) //n-1次松弛{for(int j=0; j<m; j++){if(dis[e[j].s] + map[e[j].s][e[j].e] < dis[e[j].e]){dis[e[j].e] = dis[e[j].s] + map[e[j].s][e[j].e];}}}//判断是否能继续松弛int flag = 0;for(int i=0; i<m; i++){if(dis[e[i].s] + map[e[i].s][e[i].e] < dis[e[i].e]){flag = 1;dis[e[i].e] = dis[e[i].s] + map[e[i].s][e[i].e];break;}}if(flag){return -1;}return dis[end];}int main(){int n,m;int a,b,c;while(cin>>n>>m){for(int i=0; i<m; i++){cin>>a>>b>>c;map[a][b] = c;//把边保存起来e[i].s = a;e[i].e = b;}int ans = bellman_ford(1,n,n,m);if(ans == -1){cout<<"ERROR"<<endl;}else{cout<<ans<<endl;}}return 0;}

原创粉丝点击