Advertisement
Guest User

Untitled

a guest
Mar 18th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.81 KB | None | 0 0
  1. //
  2. // Created by alexey on 16.03.18.
  3. //
  4.  
  5. #include <bits/stdc++.h>
  6.  
  7. #define fi first
  8. #define se second
  9. #define pb push_back
  10. #define sqr(x) ((x) * (x))
  11.  
  12. using namespace std;
  13. typedef long long ll;
  14. typedef unsigned long long ull;
  15. typedef pair<int, int> PII;
  16. typedef pair<ull, ull> PULL;
  17. typedef vector<int> VI;
  18. typedef long double ld;
  19. typedef unsigned uint;
  20.  
  21. const int inf = INT_MAX;
  22. const ll linf = LLONG_MAX;
  23. const int mod = 1000007;
  24.  
  25. inline int sign(ll val) { return val > 0 ? 1 : val == 0 ? 0 : -1; }
  26. inline int add(int a, int b) { return a + b >= mod ? a + b - mod : a + b; }
  27. inline int sub(int a, int b) { return a - b < 0 ? a - b + mod : a - b; }
  28. inline int mul(int a, int b) { return int(a * 1ll * b % mod); }
  29.  
  30. /*
  31. typedef struct Elem{
  32.     int index, key, value;
  33. } Elem;
  34.  */
  35.  
  36. struct Vertex{
  37.     int index, i;
  38.     int key, value;
  39.     vector < pair <int, int> > incidence;
  40. };
  41.  
  42. struct PriorityQueue{
  43.     Vertex *heap;
  44.     int cap, count;
  45. };
  46.  
  47. void swap(PriorityQueue *Q, int i, int j){
  48.     Vertex t = Q->heap[i];
  49.     Q->heap[i] = Q->heap[j];
  50.     Q->heap[j] = t;
  51. }
  52.  
  53. bool QueueEmpty(PriorityQueue *Q){
  54.     return Q->count == 0;
  55. }
  56.  
  57.  
  58. int Insert(PriorityQueue *Q, Vertex X){
  59.     int i = Q->count;
  60.     Q->count=i+1;
  61.     Q->heap[i] = X;
  62.     while(i > 0 && (Q->heap[(i-1)/2].key > Q->heap[i].key)){
  63.         swap(Q, (i-1)/2, i);
  64.         Q->heap->index = i;
  65.         i = (i-1)/2;
  66.     }
  67.     Q->heap[i].index = i;
  68.     return i;
  69. }
  70.  
  71. void Heapify(int i, int n, PriorityQueue *Q){
  72.     int j = i;
  73.     int k = 0;
  74.     while(1){
  75.         int l = 2*i +1;
  76.         int r = l+1;
  77.         j = i;
  78.         if(l<n && Q->heap[i].key > Q->heap[l].key) i = l;
  79.         if(r<n && Q->heap[i].key > Q->heap[r].key) i = r;
  80.         if(i==j)break;
  81.         swap(Q, i, j);
  82.         Q->heap[i].index = i;
  83.         Q->heap[j].index = j;
  84.     }
  85. }
  86.  
  87.  
  88. Vertex ExtractMin(PriorityQueue *Q){
  89.     Vertex X = Q->heap[0];
  90.     Q->count--;
  91.     if(Q->count>0){
  92.         Q->heap[0]=Q->heap[Q->count];
  93.         Q->heap[0].index = 0;
  94.         Heapify(0, Q->count, Q);
  95.     }
  96.     return X;
  97. }
  98.  
  99. int IncreaseKey(PriorityQueue *Q, Vertex X, int key){
  100.     int i = X.index;
  101.     X.key = key;
  102.     Q->heap[i].key = key;
  103.     while(i > 0 && Q->heap[(i - 1) / 2].key > key){
  104.         swap(Q, (i - 1) / 2, i);
  105.         Q->heap[i].index = i;
  106.         i = (i - 1) / 2;
  107.     }
  108.     X.index = i;
  109.     return i;
  110. }
  111.  
  112. void InitPriorityQueue(PriorityQueue *Q, int N)
  113. {
  114.     Q->heap = (Vertex*)malloc(N*sizeof(Vertex));
  115.     Q->cap = N;
  116.     Q->count = 0;
  117. }
  118.  
  119.  
  120.  
  121.  
  122. int main(){
  123.  
  124.     int n = 0, m = 0, count = 0;
  125.     cin >> n >> m;
  126.     vector <Vertex> V(n);
  127.  
  128.     for(int i = 0; i < n; i++) {
  129.         V[i].i = i;
  130.         V[i].index = -1;
  131.     }
  132.  
  133.     int a = 0, b = 0, c = 0;
  134.     for(int i = 0; i < m; i++){
  135.         cin >> a >> b >> c;
  136.         V[a].incidence.pb(pair <int, int> (b, c));
  137.         if(a != b)
  138.             V[b].incidence.pb(pair <int, int> (a, c));
  139.     }
  140.  
  141.     PriorityQueue MainQueue;
  142.     PriorityQueue *Q = &MainQueue;
  143.     InitPriorityQueue(Q, n);
  144.     Vertex v = V[0];
  145.     int j = 0;
  146.     while(true){
  147.         V[v.i].index = v.index = -2;
  148.         for(int i = 0; i < v.incidence.size(); i++){
  149.             Vertex u = V[v.incidence[i].fi];
  150.             if(u.index == -1){
  151.                 V[u.i].key = u.key = v.incidence[i].se;
  152.                 V[u.i].value = u.value = v.i;
  153.                 V[u.i].index = Insert(Q, u);
  154.                 cout << j++ << " ";
  155.             }
  156.             else if(u.index != -2 && v.incidence[i].se < u.key){
  157.                 V[u.i].value = u.value = v.i;
  158.                 V[u.i].index = IncreaseKey(Q, u, v.incidence[i].se);
  159.             }
  160.         }
  161.         if(QueueEmpty(Q))
  162.             break;
  163.         v = ExtractMin(Q);
  164.         count += v.key;
  165.     }
  166.  
  167.     cout<< count;
  168.  
  169.     free(MainQueue.heap);
  170.  
  171.     return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement