Advertisement
Guest User

CF training season 2 episode 2 problem E(Accepted!)

a guest
Oct 15th, 2014
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <stdio.h>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <queue>
  7. #include <stack>
  8. #include <set>
  9. #include <map>
  10. #include <string>
  11. #include <math.h>
  12. #include <cassert>
  13.  
  14. #define pb push_back
  15. #define mp make_pair
  16. #define forn(i, n) for(int i = 0; i < (int)(n); i++)
  17. #define X first
  18. #define Y second
  19. #define sz(a) (int)((a).size())
  20. #define all(a) (a).begin(), (a).end()
  21.  
  22. using namespace std;
  23.  
  24. typedef long long li;
  25. typedef long double ld;
  26. typedef pair<int, int> pt;
  27.  
  28. const int INF = (int)(1e9);
  29. const li INF64 = (li)(INF) * (li)(INF);
  30. const ld eps = 1e-9;
  31. const ld pi = (ld)(3.1415926535897932384626433832795);
  32.  
  33. const int dx4[] = {-1, 0, 1, 0};
  34. const int dy4[] = {0, 1, 0, -1};
  35.  
  36. const int ddx[] = {-1, 1, 1, -1};
  37. const int ddy[] = {1, 1, -1, -1};
  38.  
  39. const int N = 1e5;
  40.  
  41. vector<pair<int, int> > g[N];
  42. int n, m, A, k;
  43. bool used[N];
  44. int dist[N];
  45.  
  46. int main()
  47. {
  48. #ifdef _DEBUG
  49.     freopen("input.txt", "r", stdin);
  50.     freopen("output.txt", "w", stdout);
  51. #endif
  52.  
  53.     while(cin >> n >> m >> A >> k)
  54.     {
  55.         if(n + m + A + k == 0)
  56.             break;
  57.  
  58.         for(int i = 0; i < N; i++)
  59.             g[i].clear();
  60.  
  61.         memset(used, false, sizeof used);
  62.         memset(dist, -1, sizeof dist);
  63.  
  64.         forn(i, m)
  65.         {
  66.             int a, b, w;
  67.             scanf("%d %d %d", &a, &b, &w);
  68.             g[a].pb(mp(b, w));
  69.             g[b].pb(mp(a, w));
  70.         }
  71.  
  72.         int sz = n;
  73.  
  74.         forn(kk, A)
  75.         {
  76.             int v;
  77.             scanf("%d", &v);
  78.  
  79.             queue<int> q;
  80.             q.push(v);
  81.             if(!used[v])
  82.             {
  83.                 used[v] = true;
  84.                 sz--;
  85.             }
  86.  
  87.             dist[v] = 0;
  88.  
  89.             while(!q.empty())
  90.             {
  91.                 int v = q.front();
  92.                 q.pop();
  93.  
  94.                 forn(i, g[v].size())
  95.                 {
  96.                     int to = g[v][i].X;
  97.                     int cost = g[v][i].Y;
  98.                     if(dist[v] + cost < k && (dist[v] + cost < dist[to] || dist[to] == -1))
  99.                     {
  100.                         dist[to] = dist[v] + cost;
  101.                         q.push(to);
  102.                         if(!used[to])
  103.                         {
  104.                             used[to] = true;
  105.                             sz--;
  106.                         }
  107.                     }
  108.                 }
  109.             }
  110.  
  111.             printf("%d ", sz);
  112.         }
  113.  
  114.         printf("\n");
  115.     }
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement