[伯俊]13023:ABCDE(JAVA)


質問する


BOJ 13023 : ABCDE - https://www.acmicpc.net/problem/13023

に答える


友人関係と呼ばれていますが、この関係をグラフに適用すればいいです.
入力した友達関係をそれぞれの隣接リストに保存します.友人関係は双方向であるため,2つのノードの隣接リストに格納される.誰もがnodeと考え,与えられた友人関係がedgeであればDFSで検索し,隣接するノードを経由して5人で接続することで問題の条件を満たす.
開始点が異なり、それぞれdfs()を呼び出し、一度でも5人がオンになったら続行せず、出力1後に終了する.

コード#コード#

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {

    static class Person{
        int idx;
        ArrayList<Person> adj;

        public Person(int idx) {
            this.idx = idx;
            this.adj = new ArrayList<>();
        }
    }
    
    static Person[] people;
    static boolean[] visited;
    static boolean flag;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] inputs = br.readLine().split(" ");

        int n = Integer.parseInt(inputs[0]);
        int m = Integer.parseInt(inputs[1]);

        people = new Person[n];
        for(int i=0; i<n; i++){
            people[i] = new Person(i);
        }

        for(int i=0; i<m; i++){
            inputs = br.readLine().split(" ");

            int a = Integer.parseInt(inputs[0]);
            int b = Integer.parseInt(inputs[1]);

            people[a].adj.add(people[b]);
            people[b].adj.add(people[a]);
        }
        
        flag = false; 
        for(int i=0; i<n; i++){
            visited = new boolean[n];
            visited[i] = true;
            dfs(i, 1);
            if(flag) { // 5명이 이어진 경로가 있다면 1 출력 후 종료
                System.out.println(1);
                return;
            }
        }
        System.out.println(0);
    }

    public static void dfs(int now, int count){

        if(count==5){ // count는 이어진 사람의 수
            flag = true;
            return;
        }

        for(Person p : people[now].adj){
            if(!visited[p.idx]){
                visited[p.idx] = true;
                dfs(p.idx, count + 1);
                visited[p.idx] = false;
            }
        }

    }
}

整理する


✔ 알고리즘 분류 - 그래프 이론, 그래프 탐색, 깊이 우선 탐색
✔ 난이도 - 🟡 Gold 5

🤦‍♀️ 今日のメッセージ

  • ゴールド問題ですが、難しい問題ではありません.何か「関係」をあげると、グラフが思い浮かぶ!
  • コメントサイト


    いいえ