UVa 558 Wormholes / Bellman-Ford

来源:互联网 发布:2841财神一码数据分析 编辑:程序博客网 时间:2024/05/18 00:25

有个人要回到过去看大爆炸 就判断有没有负环 有负环就possible

Bellman-Ford 或者SPFA判断负环

#include <stdio.h>struct node{int s;int e;int w;}a[2010];int n,m;int dis[1010];bool BF(){int i,j,k;int x,y,z;for(i = 0;i < n; i++)dis[i] = 999999999;dis[0] = 0;for(i = 0;i < n-1; i++){for(j = 0;j < m; j++){x = a[j].s;y = a[j].e;z = a[j].w;if(dis[y] > dis[x] + z)dis[y] = dis[x] + z;}}for(j = 0;j < m; j++)// 如果松弛了n-1次还能松弛 说明有负环 {x = a[j].s;y = a[j].e;z = a[j].w;if(dis[y] > dis[x] + z){return false;}}return true; }int main(){int t,i;scanf("%d",&t);while(t--){scanf("%d %d",&n,&m);for(i = 0;i < m; i++)scanf("%d %d %d",&a[i].s,&a[i].e,&a[i].w);if(!BF()){puts("possible");}else{puts("not possible");}}return 0;}


 下面是SPFA

#include <cstdio>#include <vector>#include <queue>#include <cstring>using namespace std;const int MAX = 1010;struct node{int e;int w;};int n,m;int dis[MAX];int cnt[MAX];bool vis[MAX];vector <node> a[MAX];bool SPFA(){int i;queue <int> q;memset(vis,false,sizeof(vis));memset(cnt,0,sizeof(cnt));for(i = 0;i < n; i++)dis[i] = 999999999;dis[0] = 0;q.push(0);while(!q.empty()){int x = q.front();q.pop();vis[x] = false;int len = a[x].size();for(i = 0; i < len; i++){node t = a[x][i];if(dis[t.e] > dis[x] + t.w){dis[t.e] = dis[x] + t.w;if(!vis[t.e]){q.push(t.e);vis[t.e] = true;cnt[t.e]++;if(cnt[t.e] > n)return false;}}}}return true;}int main(){int t,i,x,y,z;scanf("%d",&t);while(t--){scanf("%d %d",&n,&m);for(i = 0;i < n; i++)a[i].clear();while(m--){scanf("%d %d %d",&x,&y,&z);a[x].push_back((node){y,z});}if(!SPFA())puts("possible");elseputs("not possible");}return 0;}


 

0 0
原创粉丝点击