[白俊2660]会長を選ぶ


質問する
W杯サッカーを応援するパーティーで会長を選ぶつもりだ.このパーティーが成立して間もなく、会員の間には知らない人もいますが、何人かを通じてお互いに知ることができます.各会員は他の会員に近い程度によって点数を得る.
たとえば、ある会員が他のすべての会員と友人である場合、その会員の点数は1点です.ある会員の点数が2点であれば、他のすべての会員が友人や友人の友人であることを示します.また、ある会員の点数が3点であれば、他のすべての会員が友人、友人の友人、友人の友人であることを示す.
4点、5点などは同じ方法で決めます.各会員に点数をつけるときに注意しなければならないのは、2人の会員が友达で、同時に友达の友达であれば、この2人は友达です.
会長は会員の中で点数が一番小さい人になる.会長の点数と会長になれるすべての人を探すプログラムを書いてください.
入力
入力した最初の行には会員数があります.ただし、会員数は50名を超えない.2行目の後、1行には2つの会員番号があり、2人の会員が互いに友达であることを示しています.会員番号は1から会員数があります.最後の行には2つの-1があります.
しゅつりょく
1行目は会長候補者の点数と候補者数を出力し、2行目は会長候補者を昇順に出力する.
🤔 注意事項
  • ベルマンフォードアルゴリズム
  • Integerが最初に到達できなかった距離(INF).MAX VALUEに設定するとオーバーフローが発生します.
  • 🎯 に答える
  • 自己->自己は0です.友達間で双方向の値を1に設定します.
  • フロイドとシャーロットの三重ゲートを通じてdistを更新した.
  • 初めてぶらぶらした時、その行の最大値で会長のお金を探しました.会長と同じ候補者を挿入します.
  • 📌 コード#コード#
    import java.io.*;
    import java.util.ArrayList;
    import java.util.StringTokenizer;
    import java.lang.Math;
    public class _2660 {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            StringTokenizer st;
            int n = Integer.parseInt(br.readLine());
            int[][] arr = new int[n+1][n+1];
            for(int i = 1; i < n+1; i++){
                for(int j = 1; j < n + 1; j++) {
                    arr[i][j] = 987654321;
                }
            }
            for(int i = 1 ; i < n+1; i++) {
                arr[i][i] = 0;
            }
            while(true) {
                st = new StringTokenizer(br.readLine());
                int a = Integer.parseInt(st.nextToken());
                int b = Integer.parseInt(st.nextToken());
                if(a == -1 && b == -1) break;
                arr[a][b] = 1;
                arr[b][a] = 1;
            }
    
            for(int k = 1; k < n + 1; k++) {
                for (int a = 1; a < n + 1; a++) {
                    for (int b = 1; b < n + 1; b++) {
                        if (arr[a][b] > arr[a][k] + arr[k][b]) {
                            arr[a][b] = arr[a][k] + arr[k][b];
                        }
                    }
                }
            }
    
            int min_val = 987654321;
            for(int i = 1; i < n+1; i++) {
                int max_val = 0;
                for (int j = 1; j < n + 1; j++) {
                    max_val = Math.max(max_val, arr[i][j]);
                }
                min_val = Math.min(min_val, max_val);
            }
    
            ArrayList<Integer> list = new ArrayList<>();
            for(int i = 1; i < n+1; i++) {
                int max_val = 0;
                for (int j = 1; j < n + 1; j++) {
                    max_val = Math.max(max_val, arr[i][j]);
                }
                if(max_val == min_val) {
                    list.add(i);
                }
            }
    
            System.out.println(min_val + " " + list.size());
            for(int val : list) {
                bw.write(String.valueOf(val) + " ");
            }
            bw.newLine();
            bw.flush();
            bw.close();
        }
    }
    
    💡知るところ
    JavaはArrayの最大値minを取得できません.
    1. Collections.max()またはCollections.min()の使用
    2.Streamに変換した後のStream.max().getAsInt()をint形式でインポートします.
    3.最大値の最小値を検索します.
    Streamとは?
  • Arrayは、集合から所望の値を取得するドアの表装を防止するために使用される.
  • 宣言、加工、返還の3つの部分に分かれています.
  • 宣言
  • スキームは、集合をストリームにする.
    ex) Arrays.stream(カラム名)
  • 加工
    オンデマンド加工
  • ストリーム
    .boxed():タイル状のStreamにプロパティを書き込む方法
    .count():配列セットのサイズをチェックする
    .sorded():ソート
    .ソート(Comparator.reverseOrder():逆ソート
    .findFirst():最初の値を取得
    .skip(i):i以降のストリームのみを取得します.(Python Sliceに類似)
    .limit(i):iのストリームのみが取得されます.
    .distinct():重複除外
    .max(データ型:compare):最大値
    .min(データ型:compare):最小値
  • ランダと一緒に使用
    .map((パラメータ)->コード):メソッドコードを内部値に適用
    .forEach((パラメータ)->コード):
  • 異なる値に異なるメソッドを適用する
    は、
  • を返します.
  • 加工の値は所望の形式で入力する
    .get():値の取得
    .getAsInt():intに値をインポート
    .toArray():配列に値をインポート
    .collect(Collectors.toList():list
  • に値をインポート