uva 558(最短路径)

来源:互联网 发布:软件注册权认证 编辑:程序博客网 时间:2024/06/07 02:57

题意:有一个科学家进行星际旅行回到过去,给出了一些星球移动之间的时间变化,如果从星球a到星球b的时间变化为负的,说明时间在倒退,如果时间变化为正的说明时间快进,问是否能让科学家回到很久很久以前。

题解:如果能存在一个负环路径让科学家不停的循环让时间无限倒退就可以实现。用bellman-ford算法,更新所有星球到地球的最短路径存到d数组中,然后再遍历以此,如果d数组的值又发生了变化说明存在负环,不存在最短路径。

#include <stdio.h> #include <string.h> const int M = 2005;const int N = 1005;const int INF = 0x3f3f3f3f;int t, n, m, flag, temp;int d[N], v[M], u[M], w[M];int main() {scanf("%d", &t);while (t--) {memset(d, INF, sizeof(d));flag = 0;scanf("%d%d", &n, &m);for (int i = 0; i < m; i++)scanf("%d%d%d", &v[i], &u[i], &w[i]);d[0] = 0;for (int i = 0; i < n - 1; i++)for (int j = 0; j < m; j++) {int x = v[j], y = u[j];if (d[x] < INF)d[y] = d[y] < d[x] + w[j] ? d[y] : d[x] + w[j];}for (int i = 0; i < m; i++) {int x = v[i], y = u[i];if (d[x] < INF) {int temp = d[y];d[y] = d[y] < d[x] + w[i] ? d[y] : d[x] + w[i];if (temp != d[y]) {flag = 1;break;}}}if (flag)printf("possible\n");elseprintf("not possible\n");}return 0;}


0 0