Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

dh-winternagi 님의 블로그

(22967) 구름다리 본문

백준 (C++)/Solve

(22967) 구름다리

dh-winternagi 2026. 4. 21. 00:31

https://www.acmicpc.net/problem/22967

단계별로 풀어보기

37단계(해 구성하기) 8번째

 

 

 

모든 정점 쌍이 이어진 완전 그래프일 때 지름이 1로 가장 작다. 이때 필요한 간선 수는 N(N-1)/2개인데, 우리가 쓸 수 있는 간선의 수는 최대 2N-2개이다. 따라서 N≤4일 때는 완전 그래프를 만들 수 있다.

이 경우 인접 행렬을 만들어 이어져 있지 않은 모든 두 정점을 잇는 다리를 만든다.

그 다음으로 가능한 형태는 하나의 정점에 나머지 모든 정점이 연결된 스타 그래프로 이때 지름은 2이다. 스타 그래프에 필요한 간선 수는 N-1개이므로 N에 상관없이 항상 지름이 2가 되도록 다리를 만들 수 있다.

이 경우 기준 정점을 1번으로 잡고, 1번과 연결되지 않은 다리는 전부 만들면 된다.

 

 

 

#include <iostream>
#include <vector>
using namespace std;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);

  int n;
  
  cin >> n;
  
  if(n<=4){
    vector adj(n+1, vector<int>(n+1));
    
    for(int i=1;i<n;i++){
      int s, e;
      
      cin >> s >> e;
      
      adj[s][e]= 1;
      adj[e][s]= 1;
    }
    
    int cnt= 0;
    for(int i=1;i<=n;i++){
      for(int j=i+1;j<=n;j++){
        if(adj[i][j]) continue;
        
        cnt++;
      }
    }
    
    cout << cnt << "\n" << 1 << "\n";
    
    for(int i=1;i<=n;i++){
      for(int j=i+1;j<=n;j++){
        if(adj[i][j]) continue;
        
        cout << i << " " << j << "\n";
      }
    }
    
    return 0;
  }
  
  vector<int> connect(n+1);
  
  int cnt= 0;
  
  for(int i=1;i<n;i++){
    int s, e;
    
    cin >> s >> e;
    
    if(s==1){
      connect[e]= 1;
      cnt++;
    }else if(e==1){
      connect[s]= 1;
      cnt++;
    }
  }
  
  cout << n-1-cnt << "\n" << 2 << "\n";
  
  for(int i=2;i<=n;i++){
    if(connect[i]) continue;
    
    cout << 1 << " " << i << "\n";
  }
  
  return 0;
}

'백준 (C++) > Solve' 카테고리의 다른 글

(14601) 샤워실 바닥 깔기 (Large)  (0) 2026.04.21
(15311) 약 팔기  (0) 2026.04.21
(13018) 특이한 수열  (0) 2026.04.21
(31836) 피보나치 기념품  (0) 2026.04.21
(25288) 영어 시험  (0) 2026.04.21