Advertisement
Guest User

Untitled

a guest
Dec 14th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1.  <iostream>
  2. #include <math.h>
  3. #include <queue>
  4. #include <vector>
  5. #define N 101
  6. using namespace std;
  7. int n, m;
  8. vector <vector <int> > graph;
  9. vector <vector <int> > graph2;
  10. vector <int> way;
  11. vector <int> isAdded;
  12.  
  13. struct EL {
  14.     int data;
  15.     int x;
  16.     int y;
  17.     EL* next;
  18.     EL(int num, int i, int j) {
  19.         data = num;
  20.         x = i;
  21.         y = j;
  22.         next = NULL;
  23.     }
  24. };
  25.  
  26. struct Queue {
  27.     EL* front;
  28.     EL* back;
  29.     int siz;
  30.     Queue() {
  31.         front = NULL;
  32.         back = NULL;
  33.         siz = 0;
  34.     }
  35.    
  36.     void push(int num, int i, int j) {
  37.         siz++;
  38.         EL* t = new EL(num, i, j);
  39.         if(front == NULL){
  40.             back = t;
  41.             front = t;
  42.             return;
  43.         }
  44.         back->next = t;
  45.         back = t;
  46.     }
  47.  
  48.     EL* pop() {
  49.         if (front == NULL) return NULL;
  50.         siz--;
  51.         EL* t = front;
  52.         front = front->next;
  53.         return t;
  54.     }
  55.  
  56.     void printQueue(EL* t) {
  57.         cout << t->data << " ";
  58.         if (t->next != NULL) printQueue(t->next);
  59.     }
  60.  
  61. };
  62.  
  63. Queue *q = new Queue();
  64.  
  65. void fillArr() {
  66.     for (int i = 1; i <= m; i++) {
  67.         int x, y, siz;
  68.         cin >> x >> y >> siz;
  69.         graph[x][y] = graph[y][x] = siz;
  70.     }
  71. }
  72.  
  73. void func(int k) {
  74.     for (int i = 1; i <= n; i++) {
  75.         if (graph[k][i] != 0 && isAdded[i] == 0) {
  76.             q->push(graph[k][i], k, i);
  77.         }
  78.     }
  79. }
  80.  
  81. void algPrima() {
  82.     for (int i = 1; i <= n; i++) {
  83.         if (isAdded[i] == 1) {
  84.             func(i);
  85.         }
  86.     }
  87.     //q->printQueue(q->front);
  88.     //cout << "\n";
  89.     //cout << q->siz << "\n";
  90.     int min = pow(2.0, 30);
  91.     int iMin = 0, jMin = 0;
  92.     int temp = q->siz;
  93.     for (int i = 1; i <= temp; i++) {
  94.         EL *t = q->pop();
  95.         if (t->data < min) {
  96.             min = t->data;
  97.             iMin = t->x;
  98.             jMin = t->y;
  99.         }
  100.     }
  101.     //cout << q->siz << "\n";
  102.     graph2[iMin][jMin] = graph2[jMin][iMin] = min;
  103.     isAdded[jMin] = isAdded[iMin] = 1;
  104. }
  105.  
  106. void output() {
  107.     int sum = 0;
  108.     for (int i = 1; i <= n; i++) {
  109.         for (int j = i + 1; j <= n; j++) {
  110.             sum += graph2[i][j];
  111.         }
  112.     }
  113.     cout << sum;
  114. }
  115.  
  116. void printGraph() {
  117.     for (int i = 1; i <= n; i++) {
  118.         for (int j = 1; j <= n; j++) {
  119.             cout << graph2[i][j] << " ";
  120.         }
  121.         cout << "\n";
  122.     }
  123. }
  124.  
  125. int main() {
  126.     cin >> n >> m;
  127.     graph.assign(n + 1, vector <int>() );
  128.     graph2.assign(n + 1, vector <int>() );
  129.     way.assign(n + 1, 0);
  130.     isAdded.assign(n + 1, 0);
  131.     for (int i = 1; i <= n; i++) {
  132.         graph[i].assign(n + 1, 0);
  133.         graph2[i].assign(n + 1, 0);
  134.     }
  135.     fillArr();
  136.     isAdded[1] = 1;
  137.     for (int i = 2; i <= n; i++) {
  138.         algPrima();
  139.     }
  140.     //printGraph();
  141.     output();
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement