Advertisement
Guest User

Untitled

a guest
May 4th, 2015
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <utility>
  3. #include <vector>
  4. #include <algorithm>
  5. #include "set"
  6.  
  7. using std::cin;
  8. using std::cout;
  9. using std::vector;
  10. using std::pair;
  11. using std::set;
  12. using std::make_pair;
  13.  
  14. const int inf = 1000000000;
  15.  
  16. template <typename T>
  17. class heap {
  18. public:
  19.     vector<T> v;
  20.     T inf;
  21.     heap (T _inf) {
  22.         inf = _inf;
  23.     }
  24.  
  25.     void heal_heap(int looking) {
  26.         int interesting_child = looking * 2 + 1;
  27.         if (interesting_child >= v.size()) {
  28.             return;
  29.         }
  30.         if (interesting_child + 1 != v.size() && v[looking * 2 + 1] > v[looking * 2 + 2]) {
  31.             ++interesting_child;
  32.         }
  33.         if (v[looking] <= v[interesting_child])
  34.             return;
  35.         std::swap(v[looking], v[interesting_child]);
  36.         heal_heap(interesting_child);
  37.     }
  38.  
  39.  
  40.     void push(T n, int len) {
  41.         T c;
  42.         int looking = 0;
  43.         int j = 0, l = len;
  44.         while (len) {
  45.             ++j;
  46.             len /= 2;
  47.         }
  48.         --j;
  49.         while (true) {
  50.             if (v[looking] > n) {
  51.                 c = n;
  52.                 n = v[looking];
  53.                 v[looking] = c;
  54.             }
  55.             looking = l >> j;
  56.             if (j < 0)
  57.                 break;
  58.             --j;
  59.         }
  60.     }
  61.  
  62.     void add(T n) {
  63.         v.push_back(inf);
  64.         push(n, v.size() - 1);
  65.     }
  66.  
  67.     T minimum() {
  68.         return v[0];
  69.     }
  70.  
  71.     T delete_minimum() {
  72.         v[0] = v.back();
  73.         v.pop_back();
  74.         heal_heap(0);
  75.     }
  76.  
  77.     int size() {
  78.         return v.size();
  79.     }
  80. };
  81.  
  82. inline void Dijkstra(int start, vector<vector<pair<int, int> > > &v, vector<pair<int, int> > &answer){
  83.     int n = v.size() - 1;
  84.     answer.clear();
  85.     heap<pair<int, int> > buffer(make_pair(inf, inf));
  86.     vector<int> len(n+1, inf);
  87.     len[start] = 0;
  88.     buffer.add(make_pair(0, start));
  89.     pair<int, int> it;
  90.     while (buffer.size()) {
  91.         it = buffer.minimum();
  92.         int now = it.second;
  93.         int length = it.first;
  94.         buffer.delete_minimum();
  95.         if (length > len[now])
  96.             continue;
  97.         answer.push_back(make_pair(now, length));
  98.         for (int j = 0; j < v[now].size(); ++j) {
  99.             if (len[v[now][j].second] > length + v[now][j].first) {
  100.                 len[v[now][j].second] = length + v[now][j].first;
  101.                 buffer.add(make_pair(len[v[now][j].second], v[now][j].second));
  102.             }
  103.         }
  104.     }
  105.  
  106. }
  107.  
  108. inline void Input(int &n, vector<vector<pair<int, int> > > &v) {
  109.     scanf("%d", &n);
  110.     int m;
  111.     v.resize(n+1);
  112.     for (int i = 1; i <= n; ++i) {
  113.         scanf("%d", &m);
  114.         int a, b;
  115.         v[i].resize(m);
  116.         for (int j = 0; j < m; ++j) {
  117.             scanf("%d %d", &a, &b);
  118.             v[i][j] = (std::make_pair(a, b));
  119.         }
  120.     }
  121. }
  122.  
  123. inline void MakeAns(int &n, int &d, vector<vector<pair<int, int> > > &v, vector<pair<int, int> > &len, vector<pair<int, int> > &ans) {
  124.     for (int i = 1; i <= n; ++i) {
  125.         Dijkstra(i, v, len);
  126.         int j = len.size() - 1;
  127.         if (d < len[j].second) {
  128.             ans.clear();
  129.             d = len[j].second;
  130.         }
  131.         while (len[j].second == d) {
  132.             ans.push_back(make_pair(i, len[j].first));
  133.             --j;
  134.         }
  135.     }
  136. }
  137.  
  138. inline void Output(int &d, vector<pair<int, int> > &ans) {
  139.     printf("%d\n", d);
  140.     for (int i = 0; i < ans.size(); ++i) {
  141.         printf("%d %d\n", ans[i].first, ans[i].second);
  142.     }
  143. }
  144.  
  145. int main() {
  146.     int n;
  147.  
  148.     vector<vector<pair<int, int> > > v;
  149.     Input(n, v);
  150.     vector<pair<int, int> > len(n+1);
  151.     int d = -1;
  152.     vector<pair<int, int> > ans(n+1);
  153.  
  154.  
  155.     MakeAns(n, d, v, len, ans);
  156.  
  157.     Output(d, ans);
  158.  
  159.     return 0;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement