Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5. int T, N, M, u, v, n;
  6. vector<vector<int>> neighbors;
  7. vector<vector<string>> Y;
  8. vector<int> cardinality, degree;
  9. vector<bool> open, deleted, closed;
  10. vector<string> label;
  11. list<int> open_cycle;
  12.  
  13. //todo
  14. void traverse(int node, int parent) {
  15.     if(closed[node]) return;
  16.     open[node] = true;
  17.     cout << "NODE: " << node << " PARENT: " << parent << " CHILDREN: " << neighbors[node].size() << endl;
  18.     for (int i = 0; i < neighbors[node].size(); ++i) {
  19.         cout << "\nCHILD: " << neighbors[node][i] << endl;
  20.         if (neighbors[node][i] == parent) continue;
  21.         if (open[neighbors[node][i]]) {
  22.             open_cycle.push_back(neighbors[node][i]);
  23.         } else {
  24.             traverse(neighbors[node][i], node);
  25.         }
  26.     }
  27.     if (!open_cycle.empty()) {
  28.         cout << "-BACHA-\n";
  29.         if (open_cycle.front() == node) {
  30.             vector<int> newNeighbors;
  31.             for (int c : open_cycle) {
  32.                 deleted[c] = true;
  33.                 for (int neighbor : neighbors[c]) {
  34.                     if (open[neighbor]) continue;
  35.                     int j = 0;
  36.                     while (neighbors[neighbor][j] != c) j++;
  37.                     neighbors[neighbor][j] = node;
  38.                     newNeighbors.push_back(neighbor);
  39.                 }
  40.             }
  41.             deleted[node] = false;
  42.             cardinality[node] = open_cycle.size();
  43.             degree[node] = newNeighbors.size();
  44.             n -= cardinality[node] - 1;
  45.             neighbors[node] = newNeighbors;
  46.             open_cycle.clear();
  47.         } else {
  48.             open_cycle.push_back(node);
  49.         }
  50.     }
  51.     open[node] = false;
  52.     closed[node] = true;
  53.     cout << "CLOSED: " << node << endl;
  54. }
  55.  
  56. string node_label(int node) {
  57.     // Y[node].push_back(label[node].substr(1, label[node].size() - 2));
  58.     sort(Y[node].begin(), Y[node].end());
  59.     label[node] = "";
  60.     for (const auto &element : Y[node]) label[node] += element;
  61.     if (cardinality[node] > 1) label[node] += "c" + to_string(cardinality[node]) + "e";
  62.     return "0" + label[node] + "1";
  63. }
  64.  
  65. string certificate() {
  66.     stack<int> leaves;
  67.     for (int i = 0; i < N; ++i) if (degree[i] == 1 && !deleted[i]) leaves.push(i);
  68.  
  69.     while (n > 2) {
  70.         stack<int> leaves2;
  71.         while (!leaves.empty()) {
  72.             int leaf = leaves.top();
  73.             leaves.pop();
  74.             for (int parent : neighbors[leaf]) {
  75.                 if (degree[parent] < 1) continue;
  76.                 degree[parent]--;
  77.                 degree[leaf]--;
  78.                 n--;
  79.                 Y[parent].push_back(node_label(leaf));
  80.                 if (degree[parent] == 1) leaves2.push(parent);
  81.             }
  82.         }
  83.         leaves = leaves2;
  84.     }
  85.     string result;
  86.     while (!leaves.empty()) {
  87.         int leaf = leaves.top();
  88.         leaves.pop();
  89.         string lbl = node_label(leaf);
  90.         if (lbl > result) {
  91.             result += lbl;
  92.         } else {
  93.             result = lbl + result;
  94.         }
  95.     }
  96.     return result;
  97. }
  98.  
  99. int main() {
  100.     cin >> T >> N >> M;
  101.     vector<string> certificates;
  102.  
  103.     neighbors.resize(N);
  104.     Y.resize(N);
  105.     label.resize(N);
  106.     cardinality.resize(N);
  107.     degree.resize(N);
  108.     open.resize(N);
  109.     closed.resize(N);
  110.     deleted.resize(N);
  111.  
  112.     for (int i = 0; i < T; ++i) {
  113.         cout << i << endl;
  114.         n = N;
  115.         for (int k = 0; k < N; ++k) {
  116.             neighbors[k].clear();
  117.             Y[k].clear();
  118.             cardinality[k] = 0;
  119.             degree[k] = 0;
  120.             open[k] = false;
  121.             closed[k] = false;
  122.             deleted[k] = false;
  123.             label[k] = "01";
  124.         }
  125.  
  126.         for (int j = 0; j < M; ++j) {
  127.             cin >> u >> v;
  128.             degree[--u]++;
  129.             degree[--v]++;
  130.             neighbors[u].push_back(v);
  131.             neighbors[v].push_back(u);
  132.         }
  133.  
  134.         /*for (int node: nodes) {
  135.             cout << "\n Node: " << node << endl << "Neighbors: ";
  136.             for (int neighbor: neighbors[node]) {
  137.                 cout << neighbor << " ";
  138.             }
  139.         }*/
  140.         cout << "Traversal:\n";
  141.         traverse(0,0);
  142.         cout << "certs\n" << certificate() << endl;
  143.         certificates.push_back(certificate());
  144.     }
  145.     sort(certificates.begin(), certificates.end());
  146.     int current = 1;
  147.     vector<int> output;
  148.     for (int i = 1; i < certificates.size(); ++i) {
  149.         if (certificates[i] == certificates[i - 1]) {
  150.             current++;
  151.         } else {
  152.             output.push_back(current);
  153.             current = 1;
  154.         }
  155.     }
  156.     output.push_back(current);
  157.     sort(output.begin(), output.end());
  158.     cout << "nazdar";
  159.     for (int i : output) {
  160.         cout << i << " ";
  161.     }
  162.     cout << endl;
  163.     return 0;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement