https://www.acmicpc.net/problem/2660
λ¬Έμ
μλμ»΅ μΆκ΅¬μ μμμ μν λͺ¨μμμ νμ₯μ μ μΆνλ €κ³ νλ€. μ΄ λͺ¨μμ λ§λ€μ΄μ§μ§ μΌλ§ λμ§ μμκΈ° λλ¬Έμ νμ μ¬μ΄μ μλ‘ λͺ¨λ₯΄λ μ¬λλ μμ§λ§, λͺ μ¬λμ ν΅νλ©΄ λͺ¨λκ° μλ‘ μ μ μλ€. κ° νμμ λ€λ₯Έ νμλ€κ³Ό κ°κΉμ΄ μ λμ λ°λΌ μ μλ₯Ό λ°κ² λλ€.
μλ₯Ό λ€μ΄ μ΄λ νμμ΄ λ€λ₯Έ λͺ¨λ νμκ³Ό μΉκ΅¬μ΄λ©΄, μ΄ νμμ μ μλ 1μ μ΄λ€. μ΄λ νμμ μ μκ° 2μ μ΄λ©΄, λ€λ₯Έ λͺ¨λ νμμ΄ μΉκ΅¬μ΄κ±°λ μΉκ΅¬μ μΉκ΅¬μμ λ§νλ€. λν μ΄λ νμμ μ μκ° 3μ μ΄λ©΄, λ€λ₯Έ λͺ¨λ νμμ΄ μΉκ΅¬μ΄κ±°λ, μΉκ΅¬μ μΉκ΅¬μ΄κ±°λ, μΉκ΅¬μ μΉκ΅¬μ μΉκ΅¬μμ λ§νλ€.
4μ , 5μ λ±μ κ°μ λ°©λ²μΌλ‘ μ ν΄μ§λ€. κ° νμμ μ μλ₯Ό μ ν λ μ£Όμν μ μ μ΄λ€ λ νμμ΄ μΉκ΅¬μ¬μ΄μ΄λ©΄μ λμμ μΉκ΅¬μ μΉκ΅¬μ¬μ΄μ΄λ©΄, μ΄ λμ¬λμ μΉκ΅¬μ¬μ΄λΌκ³ λ³Έλ€.
νμ₯μ νμλ€ μ€μμ μ μκ° κ°μ₯ μμ μ¬λμ΄ λλ€. νμ₯μ μ μμ νμ₯μ΄ λ μ μλ λͺ¨λ μ¬λμ μ°Ύλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
μ λ ₯μ 첫째 μ€μλ νμμ μκ° μλ€. λ¨, νμμ μλ 50λͺ μ λμ§ μλλ€. λμ§Έ μ€ μ΄νλ‘λ ν μ€μ λ κ°μ νμλ²νΈκ° μλλ°, μ΄κ²μ λ νμμ΄ μλ‘ μΉκ΅¬μμ λνλΈλ€. νμλ²νΈλ 1λΆν° νμμ μλ§νΌ λΆμ΄ μλ€. λ§μ§λ§ μ€μλ -1μ΄ λ κ° λ€μ΄μλ€.
μΆλ ₯
첫째 μ€μλ νμ₯ ν보μ μ μμ ν보μ μλ₯Ό μΆλ ₯νκ³ , λ λ²μ§Έ μ€μλ νμ₯ ν보λ₯Ό μ€λ¦μ°¨μμΌλ‘ λͺ¨λ μΆλ ₯νλ€.
μ½λ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
public class Main_BOJ_2660_νμ₯λ½κΈ° {
static int N;
static int[][] friendly;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer;
N = Integer.parseInt(br.readLine());
friendly = new int[N+1][N+1];
while(true){
stringTokenizer = new StringTokenizer(br.readLine());
int a = Integer.parseInt(stringTokenizer.nextToken());
int b = Integer.parseInt(stringTokenizer.nextToken());
if(a == -1 && b == -1)
break;
friendly[a][b] = 1;
friendly[b][a] = 1;
}
for(int k = 1; k < N+1 ; k++){
for(int i = 1; i < N+1 ; i++){
for(int j = 1; j < N+1; j++){
if(i == j) continue;
if(friendly[i][k] != 0 && friendly[k][j] != 0){
if(friendly[i][j] == 0)
friendly[i][j] = friendly[i][k] + friendly[k][j];
else if(friendly[i][j] > friendly[i][k] + friendly[k][j])
friendly[i][j] = friendly[i][k] + friendly[k][j];
}
}
}
}
/* for(int[] fr : friendly){
for(int f : fr)
System.out.print(f + " ");
System.out.println();
}
*/
int min = Integer.MAX_VALUE;
List<Integer> candidate = new ArrayList<>();
int[] ans = new int[N+1];
for(int i = 1; i < N+1 ;i++){
int cnt = 0;
for(int j = 1; j < N+1; j++){
cnt = cnt < friendly[i][j] ? friendly[i][j] : cnt;
}
ans[i] = cnt;
min = min > cnt ? cnt : min;
}
for(int i = 1; i <= N ;i++){
if(min == ans[i]){
candidate.add(i);
}
}
Collections.sort(candidate);
System.out.println(min + " " + candidate.size());
for(int c : candidate)
System.out.print(c + " ");
System.out.println();
}
}