minimario

USACO Silver: Cow Routing

Jul 3rd, 2015
314
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.32 KB | None | 0 0
  1. /*
  2. ID: alex_pi1
  3. LANG: C++
  4. TASK: namenum
  5. */
  6. #include <cmath>
  7. #include <cstdio>
  8. #define pb push_back
  9. #define mp make_pair
  10. #include <queue>
  11. #include <vector>
  12. #include <iostream>
  13. #include <map>
  14. #include <set>
  15. #include <algorithm>
  16. #include <fstream>
  17. #include <string>
  18. #define ll long long
  19. using namespace std;
  20. vector< pair<long long, long long> > g[1005];
  21. map<pair<long long, long long>, long long> dists;
  22. map<pair<long long, long long>, long long> flights;
  23. long long dist[1005];
  24. long long ct[1005];
  25. /* graph */
  26. /* each g[i] contains vector, vector contains pairs of (destination, distance) */
  27. int main() {
  28.     freopen("cowroute.in", "r", stdin);
  29.     freopen("cowroute.out", "w", stdout);
  30.     ios::sync_with_stdio(0);
  31.     cin.tie(0);
  32.     long long a, b, n;
  33.     cin >> a >> b >> n;
  34.     /* from a to b, n routes */
  35.     for (long long i=0; i < n; i++) {
  36.         long long cost; long long cities;
  37.         cin >> cost >> cities;
  38.         vector<long long> dests;
  39.         for (long long j=0; j < cities; j++) {
  40.             long long dest;
  41.             cin >> dest;
  42.             dests.pb(dest);
  43.         }
  44.         for (long long j=0; j < cities; j++) {
  45.             for (long long k=j+1; k < cities; k++) {
  46.                 if (j != k) {
  47.                     if (dists[mp(dests[j], dests[k])] == 0) { dists[mp(dests[j], dests[k])] = cost; flights[mp(dests[j], dests[k])] = abs(j-k); }
  48.                     else {
  49.                         if (dists[mp(dests[j], dests[k])] > cost) {
  50.                             dists[mp(dests[j], dests[k])] = cost;
  51.                             flights[mp(dests[j], dests[k])] = abs(j-k);
  52.                         }
  53.                         else if (dists[mp(dests[j], dests[k])] == cost) {
  54.                             flights[mp(dests[j], dests[k])] = min(flights[mp(dests[j], dests[k])], abs(j-k));
  55.                         }
  56.                     }
  57.                 }
  58.             }
  59.         }
  60.     }
  61.  
  62.     for (long long i=1; i <= 1000; i++) {
  63.         for (long long j=1; j <= 1000; j++) {
  64.             if (dists[mp(i,j)] != 0) { g[i].pb(mp(j, dists[mp(i,j)])); }
  65.         }
  66.     }
  67.  
  68.     for (long long i=0; i < 1005; i++) {
  69.         dist[i] = 1000000000000;
  70.         ct[i] = 1000000000000;
  71.     }
  72.  
  73.     dist[a] = 0;
  74.     ct[a] = 0;
  75.     priority_queue< pair<long long, long long>, vector<pair<long long, long long> >, greater<pair<long long, long long> > > pq;
  76.     pq.push(pair<long long, long long>(0, a));
  77.  
  78.     while (!pq.empty()) {
  79.         pair<long long, long long> frnt = pq.top();
  80.         pq.pop();
  81.         long long dista = frnt.first;
  82.         long long v = frnt.second;
  83.         if (dista > dist[frnt.second]) { continue; }
  84.         for (long long i=0; i < g[v].size(); i++) {
  85.             pair<long long, long long> vs = g[v][i];
  86.             long long distx = vs.first;
  87.             long long vertx = vs.second;
  88.             if (dist[distx] > dista+vertx || (dista + vertx == dist[distx] && ct[v] + flights[mp(v,distx)] < ct[distx])) {
  89.                 ct[distx] = ct[v] + flights[mp(v,distx)];
  90.                 dist[distx] = dista + vertx;
  91.                 pq.push(pair<long long, long long>(dist[distx], distx));
  92.             }
  93.         }
  94.     }
  95.     if (dist[b] == 1000000000000) {
  96.         cout << -1 << " " << -1 << endl;
  97.     }
  98.     else {
  99.         cout << dist[b] << " " << ct[b] << endl;
  100.     }
  101.  
  102. }
Advertisement
Add Comment
Please, Sign In to add comment