Advertisement
Hippskill

Untitled

Jan 20th, 2016
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.23 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. #include<stdio.h>
  3. #include<iostream>
  4. #include<vector>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<memory.h>
  8. #include<map>
  9. #include<set>
  10. #include<queue>
  11. #include<list>
  12. #include<sstream>
  13. #include<cstring>
  14. #include<numeric>
  15. #include<limits.h>
  16. #include<stack>
  17. using namespace std;
  18.  
  19.  
  20.  
  21.  
  22. const int N = 1e2 + 1;
  23. const int S = 1e6 + 1;
  24. const int delta = 1e5;
  25.  
  26. int s;
  27. vector<pair<int, int>> g[N];
  28. set<int> gs[N];
  29.  
  30.  
  31.  
  32. bool mu = false;
  33. bool k = false;
  34.  
  35. void addEdge(int a, int b, int c) {
  36.     g[a].push_back(make_pair(b, c));
  37.     g[b].push_back(make_pair(a, c));
  38.     if (a == b) {
  39.         k = true;
  40.     }
  41.     if (gs[a].count(b) != 0) {
  42.         mu = true;
  43.     }
  44.     if (gs[b].count(a) != 0) {
  45.         mu = true;
  46.     }
  47.     gs[a].insert(b);
  48.     gs[b].insert(a);
  49. }
  50.  
  51.  
  52. bool u[N];
  53. bool c = false;
  54. int p[N];
  55.  
  56. void dfsCycle(int v) {
  57.     u[v] = true;
  58.     for (auto to : g[v]) {
  59.         if (u[to.first]) {
  60.             if (p[v] != to.first) {
  61.                 c = true;
  62.                 return;
  63.             }
  64.         }
  65.         else {
  66.             p[to.first] = v;
  67.             dfsCycle(to.first);
  68.         }
  69.     }
  70. }
  71.  
  72.  
  73. int n, m;
  74. int dijkstra(int s) {
  75.     vector<int> d(n, LONG_MAX), p(n, -1);
  76.     vector<int> r(n, 0);
  77.     d[s] = 0;
  78.     r[0] = 0;
  79.     set < pair<int, int> > q;
  80.     q.insert(make_pair(d[s], s));
  81.     while (!q.empty()) {
  82.         int v = q.begin()->second;
  83.         q.erase(q.begin());
  84.  
  85.         for (size_t j = 0; j<g[v].size(); ++j) {
  86.             int to = g[v][j].first,
  87.                 len = g[v][j].second;
  88.             if (d[v] + len < d[to]) {
  89.                 q.erase(make_pair(d[to], to));
  90.                 d[to] = d[v] + len;
  91.                 r[to] = r[v] + 1;
  92.                 p[to] = v;
  93.                 q.insert(make_pair(d[to], to));
  94.             }
  95.         }
  96.     }
  97.     int res = 0;
  98.     for (int i = 0; i < n; i++) {
  99.         if (d[i] != LONG_MAX) {
  100.             int cur = -(d[i] - delta * r[i]);
  101.             res = max(res, cur);
  102.         }
  103.     }
  104.     return res;
  105. }
  106.  
  107. int main() {
  108. #ifndef ONLINE_JUDGE
  109.     freopen("input.txt", "r", stdin);
  110. #endif
  111.     scanf("%d%d%d", &n, &m, &s);
  112.     for (int i = 0; i < m; i++) {
  113.         int a, b, c;
  114.         scanf("%d%d%d", &a, &b, &c);
  115.         addEdge(a - 1, b - 1, -c + delta);
  116.     }
  117.     for (int i = 0; i < n; ++i) {
  118.         if (!u[i]) {
  119.             dfsCycle(i);
  120.             if (c)
  121.                 break;
  122.         }
  123.     }
  124.  
  125.     if (c || mu || k) {
  126.         printf("YES");
  127.         return 0;
  128.     }
  129.  
  130.  
  131.     int res = 0;
  132.  
  133.     for (int i = 0; i < n; i++) {
  134.         res = max(res, dijkstra(i));
  135.     }
  136.  
  137.    
  138.     printf(res >= s ? "YES" : "NO");
  139.  
  140.    
  141.     return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement