main.cc 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include <cstdio>
  2. #include <cstring>
  3. using namespace std;
  4. const int N = 500;
  5. const int M = 2500;
  6. const int W = 200;
  7. const int INF = 0x3F3F3F3F;
  8. int dist[N + 1];
  9. struct E {
  10. int s;
  11. int e;
  12. int t;
  13. E(int s = 0, int e = 0, int t = 0) : s(s), e(e), t(t) {}
  14. } edge[2 * M + W];
  15. int main() {
  16. int f, n, m, w, s, e, t, k;
  17. scanf("%d", &f);
  18. while (f--) {
  19. scanf("%d %d %d", &n, &m, &w);
  20. k = 0;
  21. for (int i = 0; i < m; i++) {
  22. scanf("%d %d %d", &s, &e, &t);
  23. edge[k].s = s;
  24. edge[k].e = e;
  25. edge[k++].t = t;
  26. edge[k].s = e;
  27. edge[k].e = s;
  28. edge[k++].t = t;
  29. }
  30. for (int i = 0; i < w; i++) {
  31. scanf("%d %d %d", &s, &e, &t);
  32. edge[k].s = s;
  33. edge[k].e = e;
  34. edge[k++].t = -t;
  35. }
  36. memset(dist, 0x3F, sizeof(dist));
  37. dist[1] = 0;
  38. for (int i = 1; i < n; i++) { // Passes no more than i edges
  39. for (int j = 0; j < k; j++) {
  40. s = edge[j].s;
  41. e = edge[j].e;
  42. if (edge[j].t + dist[s] < dist[e]) dist[e] = edge[j].t + dist[s];
  43. }
  44. }
  45. int i;
  46. for (i = 0; i < k; i++) {
  47. s = edge[i].s;
  48. e = edge[i].e;
  49. if (edge[i].t + dist[s] < dist[e]) break;
  50. }
  51. if (i < k)
  52. printf("YES\n");
  53. else
  54. printf("NO\n");
  55. }
  56. return 0;
  57. }