Advertisement
Guest User

Untitled

a guest
Sep 20th, 2014
779
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.99 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3. #include <queue>
  4. #include <set>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. typedef long long ll;
  9. typedef pair <ll, int> lli;
  10.  
  11. const int Maxn = 100005;
  12. const ll Inf = 1000000000000000000ll;
  13.  
  14. struct edge {
  15.     int b;
  16.     ll d, nr;
  17.     edge(int b = 0, ll d = 0, ll nr = 0): b(b), d(d), nr(nr) { }
  18. };
  19.  
  20. int t;
  21. int n, k, m;
  22. vector <edge> E;
  23. vector <int> neigh[Maxn];
  24. ll dist[Maxn];
  25. ll P;
  26. set <int> res;
  27.  
  28. ll getP()
  29. {
  30.     fill(dist, dist + n + 1, 0); dist[n] = Inf;
  31.     priority_queue <lli> Q; Q.push(lli(Inf, n));
  32.     while (!Q.empty()) {
  33.         int v = Q.top().second; ll nr = Q.top().first; Q.pop();
  34.         if (nr != dist[v]) continue;
  35.         if (v <= k) return nr;
  36.         for (int i = 0; i < neigh[v].size(); i++) {
  37.             int e = neigh[v][i];
  38.             if (min(nr, E[e].nr) > dist[E[e].b]) { dist[E[e].b] = min(nr, E[e].nr); Q.push(lli(dist[E[e].b], E[e].b)); }
  39.         }
  40.     }
  41.     return 0ll;
  42. }
  43.  
  44. void getRes()
  45. {
  46.     fill(dist, dist + n + 1, Inf); dist[n] = 0;
  47.     priority_queue <lli> Q; Q.push(lli(-dist[n], n));
  48.     ll mn = Inf;
  49.     while (!Q.empty()) {
  50.         int v = Q.top().second; ll d = -Q.top().first; Q.pop();
  51.         if (d != dist[v]) continue;
  52.         if (v <= k) {
  53.             if (d < mn) mn = d;
  54.             if (d == mn) res.insert(v);
  55.         }
  56.         for (int i = 0; i < neigh[v].size(); i++) {
  57.             int e = neigh[v][i];
  58.             if (E[e].nr >= P && d + E[e].d < dist[E[e].b]) { dist[E[e].b] = d + E[e].d; Q.push(lli(-dist[E[e].b], E[e].b)); }
  59.         }
  60.     }
  61. }
  62.  
  63. int main()
  64. {
  65.     scanf("%d", &t);
  66.     for (int tc = 1; tc <= t; tc++) {
  67.         scanf("%d %d %d", &n, &k, &m);
  68.         for (int i = 1; i <= n; i++)
  69.             neigh[i].clear();
  70.         E.resize(2 * m);
  71.         for (int i = 0; i < m; i++) {
  72.             int a, b, d, nr; scanf("%d %d %d %d", &a, &b, &d, &nr);
  73.             E[2 * i] = edge(b, d, nr); neigh[a].push_back(2 * i);
  74.             E[2 * i + 1] = edge(a, d, nr); neigh[b].push_back(2 * i + 1);
  75.         }
  76.         P = getP();
  77.         res.clear();
  78.         getRes();
  79.         printf("Case #%d:", tc);
  80.         for (set <int>::iterator it = res.begin(); it != res.end(); it++)
  81.             printf(" %d", *it);
  82.         printf("\n");
  83.     }
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement