Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2014
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.15 KB | None | 0 0
  1. #include <fstream>
  2. #include <vector>
  3. #include <cstdio>
  4. #define INF (int) 1e9+7;
  5.  
  6. using namespace std;
  7. vector <int> g[30010];
  8. vector <int> w[30010];
  9. int n, m, a, b, u, v, s, size, j;
  10. int q[30010], d[30010], used[30010];
  11.  
  12. void swap(int a, int b) {
  13.     int c = a;
  14.     a = b;
  15.     b = c;
  16. }
  17.  
  18. void siftDown(int i) {
  19.     while (2 * i + 1 < size) {
  20.         int left = 2 * i + 1;
  21.         int right = 2 * i + 2;
  22.         j = left;
  23.         if (right < size && q[right] < q[left])
  24.             j = right;
  25.         if (q[i] <= q[j])
  26.             break;
  27.         swap(q[i], q[j]);
  28.         i = j;
  29.     }
  30. }
  31.  
  32. void siftUp(int i) {
  33.     while (q[i] < q[(i - 1) / 2])
  34.         swap(q[i], q[(i - 1) / 2]);
  35.         i = (i - 1) / 2;
  36. }
  37.  
  38. void insert (int k) {
  39.     size++;
  40.     q[size - 1] = k;
  41.     siftUp(size - 1);
  42.     used[k] = true;
  43. }
  44.  
  45. int extractMin() {
  46.     int min = q[0];
  47.     q[0] = q[size - 1];
  48.     size--;
  49.     siftDown(0);
  50.     return min;
  51. }
  52.  
  53. int main() {
  54.     ifstream in("pathbgep.in");
  55.     ofstream out("pathbgep.out");
  56.     in >> n >> m;
  57.     for (int i = 1; i <= n; i++) {
  58.         used[i] = false;
  59.         d[i] = INF;
  60.     }
  61.  
  62.     for (int i = 0; i < m; i++) {
  63.         in >> a >> b >> v;
  64.         g[a].push_back(b);
  65.         g[b].push_back(a);
  66.         w[a].push_back(v);
  67.         w[b].push_back(v);
  68.     }
  69.  
  70.     s = 1;
  71.     d[s] = 0;
  72.     size = 0;
  73.     insert(s);
  74.     while(size != 0) {
  75.         u = extractMin();
  76.         int  l = g[u].size();
  77.         for (int i = 0; i < l; i++)
  78.             if (d[g[u][i]] > d[u] + w[u][i]){
  79.                 d[g[u][i]] = d[u] + w[u][i];
  80.                 if (!used[g[u][i]])
  81.                     insert(g[u][i]);
  82.             }
  83.     }
  84.  
  85.     for (int i = 1; i <= n; i++)
  86.         out << d[i] << ' ';
  87.      
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement