Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // olimpudkiB.cpp: определяет точку входа для консольного приложения.
- //
- //#include "stdafx.h"
- #include <iostream>
- #include <vector>
- #include <string>
- #include <cmath>
- #include <algorithm>
- #include <set>
- using namespace std;
- vector < pair<int, int> > prufer_decode(const vector<int> & prufer_code) {
- int n = (int)prufer_code.size() + 2;
- vector<int> degree(n, 1);
- for (int i = 0; i < n - 2; ++i)
- ++degree[prufer_code[i]];
- set<int> leaves;
- for (int i = 0; i < n; ++i)
- if (degree[i] == 1)
- leaves.insert(i);
- vector < pair<int, int> > result;
- for (int i = 0; i < n - 2; ++i) {
- int leaf = *leaves.begin();
- leaves.erase(leaves.begin());
- int v = prufer_code[i];
- result.push_back(make_pair(leaf, v));
- if (--degree[v] == 1)
- leaves.insert(v);
- }
- result.push_back(make_pair(*leaves.begin(), *--leaves.end()));
- return result;
- }
- bool comp(const pair<int, int> &a, const pair<int, int> &b)
- {
- if (a.first < b.first)
- {
- return true;
- }
- else if (a.first == b.first)
- {
- if (a.second < b.second)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- else
- {
- return false;
- }
- }
- int main()
- {
- long long a;
- vector<int> prufer_code;
- while (cin >> a)
- {
- if (!a)
- {
- break;
- }
- prufer_code.push_back(a - 1);
- }
- vector < pair<int, int> > edges = prufer_decode(prufer_code);
- for (int i = 0; i < edges.size(); ++i)
- {
- if (edges[i].first > edges[i].second)
- {
- swap(edges[i].first, edges[i].second);
- }
- }
- sort(edges.begin(), edges.end(), comp);
- for (int i = 0; i < edges.size(); ++i)
- {
- cout << edges[i].first + 1 << ' ' << edges[i].second + 1 << endl;
- }
- //system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement