POJ
来源:互联网 发布:w 是什么矩阵 编辑:程序博客网 时间:2024/06/10 20:43
#include <iostream>#include <string.h>#include <queue>#include <cstdio>#include <vector>#define INF 0x3f3f3f3fusing namespace std;struct Edge{ int from, to, dist; Edge(int u, int v, int d): from(u), to(v), dist(d) {}};vector<Edge> edges;vector<int> G[501];bool SPFA(int n){ queue<int> Q; int d[501]; memset(d, 0x3f, sizeof(d)); d[1] = 0; bool v[501]; int cnt[501]; memset(cnt, 0, sizeof(cnt)); memset(v, 0, sizeof(v)); v[1] = true; Q.push(1); while (!Q.empty()) { int temp = Q.front(); Q.pop(); v[temp] = false; for (int k = 0; k < G[temp].size(); k++) { Edge& e = edges[G[temp][k]]; if (d[temp] < INF && d[e.to] > d[temp] + e.dist) { d[e.to] = d[temp] + e.dist; if (!v[e.to]) { Q.push(e.to); v[e.to] = true; if (++cnt[e.to] > n) return false; } } } } return true;}int main(){ freopen("aa.txt", "r", stdin); int F, n, m, w; //fields path wormhole scanf("%d", &F); int a, b, t; while (F--) { edges.clear(); for (int i = 0; i < 501; i++) G[i].clear(); cin >> n >> m >> w; while (m--) { scanf("%d %d %d", &a, &b, &t); //cin >> a >> b >> t; edges.push_back(Edge(a, b, t)); int k = edges.size(); G[a].push_back(k - 1); edges.push_back(Edge(b, a, t)); k = edges.size(); G[b].push_back(k - 1); } while (w--) { scanf("%d %d %d", &a, &b, &t); //cin >> a >> b >> t; edges.push_back(Edge(a, b, -t)); int k = edges.size(); G[a].push_back(k - 1); } if (!SPFA(n)) printf("YES\n"); else printf("NO\n"); //cout << "NO" << endl; }}
2 0