vitormartinotti

metro

Sep 2nd, 2025
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 200010;
  4.  
  5. vector<int> grafo[MAXN];
  6.  
  7. int marc[MAXN], grau[MAXN], removido[MAXN], pai[MAXN];
  8.  
  9. void dfs(int v) {
  10.     marc[v] = 1;
  11.     for(auto viz : grafo[v]){
  12.         if(marc[viz] == 0){
  13.             pai[viz] = v;
  14.             dfs(viz);
  15.         }
  16.     }
  17. }
  18.  
  19. int main(){
  20.     int n, m; scanf("%d %d", &n, &m);
  21.  
  22.     for(int i = 0; i < m; i++){
  23.         int a, b; scanf("%d %d", &a, &b);
  24.         grafo[a].push_back(b); grau[a]++; //Insere o vizinho e aumenta o grau
  25.         grafo[b].push_back(a); grau[b]++;
  26.     }
  27.  
  28.     //O centro é o vértice de maior grau
  29.     int centro = 0;
  30.     int na_linha = 0;
  31.     for(int i = 1; i <= n; i++){
  32.         if(grau[i] > grau[centro]){
  33.             centro = i;
  34.         }
  35.         if(grau[i] == 3){ //Encontra algum vértice na linha circular
  36.             na_linha = i;
  37.         }
  38.     }
  39.  
  40.     dfs(na_linha); //Estabelece o vetor pai[n] a partir de um vértice na linha circular
  41.  
  42.     //Marca o centro como removido e diminui o grau dos seus vizinhos
  43.     removido[centro] = 1;
  44.     for(auto viz : grafo[centro]){
  45.         grau[viz]--;
  46.     }
  47.  
  48.     //Cada "ponta solta" começa por um vértice de grau 1 e termina em um vértice de grau 3
  49.     //Ao remover um vértice, o próximo vértice da "ponta solta" (prox) terá grau um
  50.     for(int i = 1; i <= n; i++){
  51.         if(grau[i] == 1){
  52.             removido[i] = 1;
  53.             int prox = pai[i];
  54.             grau[prox]--;
  55.             while(grau[prox] == 1){
  56.                 removido[prox] = 1;
  57.                 prox = pai[prox];
  58.             }
  59.         }
  60.     }
  61.  
  62.     int resp = 0;
  63.     for(int i = 1; i <= n; i++){
  64.         if(removido[i] == 0){
  65.             resp++;
  66.         }
  67.     }
  68.  
  69.     printf("%d", resp);
  70.  
  71. }
Advertisement
Add Comment
Please, Sign In to add comment