Advertisement
Guest User

Untitled

a guest
Dec 5th, 2016
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.73 KB | None | 0 0
  1. // olimpudkiB.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. //#include "stdafx.h"
  5. #include <iostream>
  6. #include <vector>
  7. #include <string>
  8. #include <cmath>
  9. #include <algorithm>
  10. #include <set>
  11.  
  12. using namespace std;
  13.  
  14.  
  15.  
  16. vector < pair<int, int> > prufer_decode(const vector<int> & prufer_code) {
  17.     int n = (int)prufer_code.size() + 2;
  18.     vector<int> degree(n, 1);
  19.     for (int i = 0; i < n - 2; ++i)
  20.         ++degree[prufer_code[i]];
  21.  
  22.     set<int> leaves;
  23.     for (int i = 0; i < n; ++i)
  24.         if (degree[i] == 1)
  25.             leaves.insert(i);
  26.  
  27.     vector < pair<int, int> > result;
  28.     for (int i = 0; i < n - 2; ++i) {
  29.         int leaf = *leaves.begin();
  30.         leaves.erase(leaves.begin());
  31.  
  32.         int v = prufer_code[i];
  33.         result.push_back(make_pair(leaf, v));
  34.         if (--degree[v] == 1)
  35.             leaves.insert(v);
  36.     }
  37.     result.push_back(make_pair(*leaves.begin(), *--leaves.end()));
  38.     return result;
  39. }
  40.  
  41. bool comp(const pair<int, int> &a, const pair<int, int> &b)
  42. {
  43.     if (a.first < b.first)
  44.     {
  45.         return true;
  46.     }
  47.     else if (a.first == b.first)
  48.     {
  49.         if (a.second < b.second)
  50.         {
  51.             return true;
  52.         }
  53.         else
  54.         {
  55.             return false;
  56.         }
  57.     }
  58.     else
  59.     {
  60.         return false;
  61.     }
  62. }
  63. int main()
  64. {
  65.    
  66.     long long a;
  67.     vector<int> prufer_code;
  68.     while (cin >> a)
  69.     {
  70.         if (!a)
  71.         {
  72.             break;
  73.         }
  74.         prufer_code.push_back(a - 1);
  75.     }
  76.     vector < pair<int, int> > edges = prufer_decode(prufer_code);
  77.     for (int i = 0; i < edges.size(); ++i)
  78.     {
  79.         if (edges[i].first > edges[i].second)
  80.         {
  81.             swap(edges[i].first, edges[i].second);
  82.         }
  83.     }
  84.     sort(edges.begin(), edges.end(), comp);
  85.     for (int i = 0; i < edges.size(); ++i)
  86.     {
  87.         cout << edges[i].first + 1 << ' ' << edges[i].second + 1 << endl;
  88.     }
  89.     //system("pause");
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement