Advertisement
radmickey

Untitled

Mar 19th, 2023
803
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.48 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. enum EuropeCountriesNum {
  4.     AD,
  5.     AL,
  6.     AM,
  7.     AT,
  8.     BA,
  9.     BE,
  10.     BG,
  11.     BY,
  12.     CH,
  13.     CY,
  14.     CZ,
  15.     DE,
  16.     DK,
  17.     EE,
  18.     ES,
  19.     FI,
  20.     FR,
  21.     GE,
  22.     GR,
  23.     HR,
  24.     HU,
  25.     IE,
  26.     IS,
  27.     IT,
  28.     LI,
  29.     LT,
  30.     LU,
  31.     LV,
  32.     MC,
  33.     MD,
  34.     ME,
  35.     MK,
  36.     MT,
  37.     NL,
  38.     NO,
  39.     PL,
  40.     PT,
  41.     RO,
  42.     RS,
  43.     RU,
  44.     SE,
  45.     SI,
  46.     SK,
  47.     SM,
  48.     TR,
  49.     UA,
  50.     UK,
  51.     VA,
  52.     XK
  53. };
  54.  
  55. const char* EuropeCountriesName[] = {"AD", "AL", "AM", "AT", "BA", "BE", "BG", "BY", "CH", "CY", "CZ", "DE", "DK", "EE", "ES",
  56.                                      "FI", "FR", "GE", "GR", "HR", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MD",
  57.                                      "ME", "MK", "MT", "NL", "NO", "PL", "PT", "RO", "RS", "RU", "SE", "SI", "SK", "SM", "TR",
  58.                                      "UA", "UK", "VA", "XK"};
  59.  
  60.  
  61. class Graph {
  62. private:
  63.     std::vector<std::vector<size_t>> graph_;
  64.     std::vector<std::vector<int>> distances_;
  65.     std::vector<std::vector<int>> connectivity_components_;
  66.  
  67.     std::vector<int> center_;
  68.     std::vector<int> largest_connectivity_component_;
  69.     std::vector<std::vector<int>> graph_largest_connectivity_component_;
  70.     std::vector<std::vector<int>> matrix_;
  71.  
  72.  
  73.     size_t size_;
  74.     int rad_;
  75.     int delta_max_;
  76.     int delta_min_;
  77.  
  78.     const int MAXN = 100; // maximum number of vertices
  79.     const int INF = 0x3f3f3f3f;
  80.  
  81.     int match[100];
  82.     bool visited[100];
  83.     int parent[100];
  84.     int capacity[100][100];
  85.  
  86.  
  87. private:
  88.     void floyd_warshall() {
  89.         int n = graph_.size();
  90. //        std::vector<std::vector<int>> distances_(n, std::vector<int>(n));
  91.  
  92.         for (int i = 0; i < n; i++) {
  93.             for (int j = 0; j < n; j++) {
  94.                 if (find(graph_[i].begin(), graph_[i].end(), j) != graph_[i].end()) {
  95.                     distances_[i][j] = 1;
  96.                 } else {
  97.                     distances_[i][j] = INT_MAX;
  98.                 }
  99.             }
  100.         }
  101.  
  102.         for (int k = 0; k < n; k++) {
  103.             for (int i = 0; i < n; i++) {
  104.                 for (int j = 0; j < n; j++) {
  105.                     if (i == j) {
  106.                         continue;
  107.                     }
  108.                     if (distances_[i][k] != INT_MAX && distances_[k][j] != INT_MAX) {
  109.                         distances_[i][j] = std::min(distances_[i][j], distances_[i][k] + distances_[k][j]);
  110.                     }
  111.                 }
  112.             }
  113.         }
  114.     }
  115.  
  116.     void find_connectivity_components() {
  117.         std::vector<bool> visited(size_, false);
  118.         std::vector<int> vec_temp;
  119.  
  120.         std::queue<int> q;
  121.         for (int v = 0; v < size_; v++) {
  122.             if (visited[v]) {
  123.                 continue;
  124.             }
  125.             q.push(v);
  126.             visited[v] = true;
  127.             vec_temp.push_back(v);
  128.             while (!q.empty()) {
  129.                 int cur = q.front();
  130.                 q.pop();
  131.                 for (auto to: graph_[cur]) {
  132.                     if (!visited[to]) {
  133.                         q.push(to);
  134.                         vec_temp.push_back(to);
  135.                         visited[to] = true;
  136.                     }
  137.                 }
  138.             }
  139.  
  140.             connectivity_components_.push_back(vec_temp);
  141.             vec_temp.clear();
  142.         }
  143.     }
  144.  
  145. public:
  146.  
  147.     Graph(size_t size) : size_(size), rad_(-1), delta_max_(-1), delta_min_(-1) {
  148.         graph_.resize(size);
  149.         distances_ = std::vector<std::vector<int>>(size_, std::vector<int>(size_));
  150.  
  151.     }
  152.  
  153.     void add_edge(size_t u, size_t v) {
  154.         graph_[u].push_back(v);
  155.         graph_[v].push_back(u);
  156. //        matrix_[u][v] = 1;
  157. //        matrix_[v][u] = 1;
  158.     }
  159.  
  160.     void pre_commands() {
  161.         floyd_warshall();
  162.         find_connectivity_components();
  163.         int idx = 0;
  164.         int size_temp = 0;
  165.         for (int i = 0; i < connectivity_components_.size(); i++) {
  166.             if (connectivity_components_[i].size() > size_temp) {
  167.                 idx = i;
  168.                 size_temp = connectivity_components_[i].size();
  169.             }
  170.         }
  171.         largest_connectivity_component_ = connectivity_components_[idx];
  172.         graph_largest_connectivity_component_.resize(largest_connectivity_component_.size());
  173.         std::unordered_map<int, int> vertex_change_map;
  174.         std::vector<std::string> names_(largest_connectivity_component_.size());
  175.         for (int i = 0; i < largest_connectivity_component_.size(); i++) {
  176.             vertex_change_map[largest_connectivity_component_[i]] = i;
  177.             names_[i] = EuropeCountriesName[largest_connectivity_component_[i]];
  178.         }
  179.         std::vector<int> temp_vec;
  180.         for (int i = 0; i < largest_connectivity_component_.size(); i++) {
  181.             for (int j : graph_[largest_connectivity_component_[i]]) {
  182.                 temp_vec.push_back(vertex_change_map[j]);
  183.             }
  184.             graph_largest_connectivity_component_[i] = temp_vec;
  185.             temp_vec.clear();
  186.         }
  187.  
  188.         for (int i = 0; i < graph_largest_connectivity_component_.size(); i++) {
  189.             for (auto j : graph_largest_connectivity_component_[i]) {
  190.                 std::cout << names_[i] << " -- " << names_[j] << '\n';
  191.             }
  192.         }
  193.  
  194.         const size_t size_new = graph_largest_connectivity_component_.size();
  195.  
  196.         matrix_ = std::vector<std::vector<int>>(size_new, std::vector<int>(size_new));
  197.         for(int i = 0; i < size_new; i++) {
  198.             for (auto j : graph_largest_connectivity_component_[i]) {
  199.                 matrix_[i][j] = 1;
  200.                 matrix_[j][i] = 1;
  201.             }
  202.         }
  203.  
  204.     }
  205.  
  206.     int dist(size_t u, size_t v) {
  207.         return distances_[u][v];
  208.     }
  209.  
  210.     int e(size_t v) {
  211.         int answer = 0;
  212.  
  213.         for (auto u : largest_connectivity_component_) {
  214.             if (u != v)
  215.             answer = std::max(answer, dist(u, v));
  216.         }
  217.         return answer;
  218.     }
  219.  
  220.     int rad() {
  221.         if (rad_ != -1) {
  222.             return rad_;
  223.         }
  224.  
  225.         int answer = INT_MAX;
  226.         for (auto v : largest_connectivity_component_) {
  227.             answer = std::min(answer, e(v));
  228.         }
  229.         rad_ = answer;
  230.         return answer;
  231.     }
  232.  
  233.     int diam() {
  234.         int answer = INT_MIN;
  235.         for (auto v : largest_connectivity_component_) {
  236.             answer = std::max(answer, e(v));
  237.         }
  238.         return answer;
  239.     }
  240.  
  241.     std::vector<int>& center() {
  242.         if (!center_.empty()) {
  243.             return center_;
  244.         }
  245.  
  246.         for (auto v : largest_connectivity_component_) {
  247.             if (e(v) == rad()) {
  248.                 center_.push_back(v);
  249.             }
  250.         }
  251.  
  252.         return center_;
  253.     }
  254.  
  255.     int deg(size_t v) {
  256.         return graph_[v].size();
  257.     }
  258.  
  259.     int delta_max() {
  260.         if (delta_max_ != -1) {
  261.             return delta_max_;
  262.         }
  263.  
  264.         int answer = INT_MIN;
  265.         for (auto v : largest_connectivity_component_) {
  266.             answer = std::max(answer, deg(v));
  267.         }
  268.         delta_max_ = answer;
  269.         return answer;
  270.     }
  271.  
  272.     int delta_min() {
  273.         if (delta_min_ != -1) {
  274.             return delta_min_;
  275.         }
  276.  
  277.         int answer = INT_MAX;
  278.         for (auto v : largest_connectivity_component_) {
  279.             answer = std::min(answer, deg(v));
  280.         }
  281.         delta_min_ = answer;
  282.  
  283.         return answer;
  284.     }
  285.  
  286.     void print_edges() {
  287.         for (int i = 0; i < graph_largest_connectivity_component_.size(); i++) {
  288.             for (int j : graph_largest_connectivity_component_[i]) {
  289.                 std::cout << i << ' ' << j << '\n';
  290.             }
  291.         }
  292.     }
  293.  
  294. };
  295.  
  296.  
  297. int main() {
  298.     const size_t kNumberOfCountriesInEurope = 49;//49;
  299.     const size_t kNumberOfEdgesInEuropeGraph = 91;//91;
  300.     Graph Europe(kNumberOfCountriesInEurope);
  301.  
  302.     for (int i = 0; i < kNumberOfEdgesInEuropeGraph; i++) {
  303.         int u;
  304.         int v;
  305.         std::cin >> u >> v;
  306.         Europe.add_edge(u, v);
  307.     }
  308.  
  309.     Europe.pre_commands();
  310.  
  311. //    std::cout << "-----------------------------\n";
  312. //    std::cout << "rad(G) = " << Europe.rad() << '\n';
  313. //    std::cout << "diam(G) = " << Europe.diam() << '\n';
  314. //    std::cout << "girth(G) = " << ' ' << '\n';
  315. //    std::cout << "center(G) = {";
  316. //    for (auto i : Europe.center()) {
  317. //        std::cout << i << ' ';// EuropeCountriesName[i] << ' ';
  318. //    }
  319. //    std::cout << "}\n";
  320. //        Europe.print_edges();
  321.     return 0;
  322. }
  323.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement