matheus_monteiro

batarra_mondey_graph

Jun 6th, 2022 (edited)
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.88 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <utility>
  5. #include <algorithm>
  6.  
  7. class Graph {
  8. private:
  9.     int n;
  10.     std::vector<std::vector<int>> G;
  11.     std::vector<bool> color;
  12. public:
  13.     Graph(int n) {
  14.         this->n = n;
  15.         this->G.resize(n);
  16.     }
  17.     void addEdge(int u, int v) {
  18.         G[u].push_back(v);
  19.         G[v].push_back(u);
  20.     }
  21.     std::pair<int, int> most_distant(int u) {
  22.         std::vector<int> dist(n, -1);
  23.         std::queue<int> q;
  24.         dist[u] = 0;
  25.         q.push(u);
  26.         while(!q.empty()) {
  27.             int v = q.front();
  28.             q.pop();
  29.             for(const int &w : G[v]) {
  30.                 if(dist[w] == -1) {
  31.                     dist[w] = dist[v] + 1;
  32.                     q.push(w);
  33.                 }
  34.             }
  35.         }
  36.         int vertex;
  37.         int dist_val = -1;
  38.         for(int v = 0; v < n; ++v) {
  39.             if(dist[v] > dist_val) {
  40.                 dist_val = dist[v];
  41.                 vertex = v;
  42.             }
  43.         }
  44.         return std::make_pair(dist_val, vertex);
  45.     }
  46.     void dfs(int u) {
  47.         color[u] = true;
  48.         for(const int &v : G[u]) {
  49.             if(!color[v]) {
  50.                 dfs(v);
  51.             }
  52.         }
  53.     }
  54.     int count_components() {
  55.         color.clear();
  56.         color.resize(n, false);
  57.         int count = 0;
  58.         for(int u = 0; u < n; ++u) {
  59.             if(!color[u]) {
  60.                 dfs(u);
  61.                 ++count;
  62.             }
  63.         }
  64.         return count;
  65.     }
  66. };
  67.  
  68. int main(){
  69.  
  70.     std::string edges;
  71.     std::getline(std::cin, edges);
  72.  
  73.     int pointer = 0;
  74.     std::cout << edges << std::endl;
  75.  
  76.     auto get_next = [&]() {
  77.         if(pointer >= edges.size()) {
  78.             return '#';
  79.         }
  80.         return edges[pointer];
  81.     };
  82.  
  83.     auto is_digit = [&]() {
  84.         return get_next() >= '0' and get_next() <= '9';
  85.     };
  86.  
  87.     auto get_int = [&]() {
  88.         int res = 0;
  89.         while(get_next() != '#' and is_digit() == false)
  90.             ++pointer;
  91.         while(is_digit()) {
  92.             res = res * 10 + get_next() - '0';
  93.             ++pointer;
  94.         }
  95.         return res;
  96.     };
  97.  
  98.     std::vector<std::pair<int, int>> list_edges;
  99.     int n = 0;
  100.  
  101.     while(pointer < edges.size()) {
  102.         int u = get_int();
  103.         int v = get_int();
  104.         list_edges.push_back(std::make_pair(u, v));
  105.         n = std::max(u + 1, n);
  106.         n = std::max(v + 1, n);
  107.     }
  108.  
  109.     Graph graph(n);
  110.  
  111.     for(const auto&[u, v] : list_edges) {
  112.         graph.addEdge(u, v);
  113.     }
  114.  
  115.     int max_dist = 0;
  116.  
  117.     for(int i = 0; i < n; ++i) {
  118.         auto [dist, vertex] = graph.most_distant(i);
  119.         max_dist = std::max(max_dist, dist);
  120.     }
  121.  
  122.     std::cout << "Max dist: " << max_dist << std::endl;
  123.     std::cout << "Number of compoenents: " << graph.count_components() << std::endl;
  124.  
  125.     return 0;
  126. }
  127.  
Add Comment
Please, Sign In to add comment