白駿2644号(Java)
BFS
BFSで白俊2644号をJavaに解く.
最初は問題の理解が足りなかったので、自分で変な条件を作って、過去に戻りましたが、理解してみると簡単なBFS問題であることがわかりました.
1本の足にまたがってナビゲートする
BFSの意味で、まず幅検索を行い、私が探している相手の番号と一致するかどうかを計算します.
Qのサイズに合わせてドアを繰り返し回し、条件に合ったやつを加え、Q乞いまでwhile
ドアを回し、世代を上げればいい.
Qのサイズのように重文を回す理由は、親の方向も子供の方向も同じなので、一つの段階に加わる人には同じ節度があるからです.
途中で私が探している相手に出会ったら、return
を打つので、相手が見つからない場合は、while
のドアを離れて、彼を-1に戻させます.
以下は私が書いたbfs(int人1,int人2)コードです.static Integer bfs(int p1, int p2){
int result = 0;
Queue<Integer> q = new LinkedList<>();
q.add(p1);
while(!q.isEmpty()){
int size = q.size();
for(int i=0; i<size; i++){
int cur = q.poll();
visited[cur] = true;
if(cur==p2) return result;
for (int child = 1; child <= n; child++) {
if (map[cur][child] == 1) {
if (!visited[child])
q.add(child);
}
}
}
result++; // 촌수 늘려주기
}
return -1;
}
親と子を区別しない関連面を表示
最初のエラーはmap[][]
でmap[parent][[child]
にのみ接続マークが付けられていたことです.その結果,親の向上と子の向上の動作の間に差が生じ,方向性に応じて処理する問題が生じた.もちろん、単独で処理しても結果は間違っています.
重要なのは、互いにつながっている限り、map[][]
の上の両側にマークをつけなければならない.上下に違いはない.
これはどういう意味ですか.次のコードを見るともっとよく理解できるはずです.for(int i=0; i<m; i++){
stk = new StringTokenizer(bfr.readLine());
int parent = Integer.parseInt(stk.nextToken());
int child = Integer.parseInt(stk.nextToken());
map[parent][child] = 1; \\
양 방향 모두!!
map[child][parent] = 1; //
}
次は私が提出したコードです.import java.util.*;
import java.io.*;
public class boj2644 {
static int n,m, p1,p2;
static int[][] map;
static boolean[] visited;
public static void main(String args[]) throws IOException {
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer stk = new StringTokenizer(bfr.readLine());
n = Integer.parseInt(stk.nextToken());
map = new int[n+1][n+1]; visited = new boolean[n+1];
stk = new StringTokenizer(bfr.readLine());
p1 = Integer.parseInt(stk.nextToken()); p2 = Integer.parseInt(stk.nextToken());
stk = new StringTokenizer(bfr.readLine());
m = Integer.parseInt(stk.nextToken());
for(int i=0; i<m; i++){
stk = new StringTokenizer(bfr.readLine());
int parent = Integer.parseInt(stk.nextToken());
int child = Integer.parseInt(stk.nextToken());
map[parent][child] = 1;
map[child][parent] = 1;
}
bfw.write(String.valueOf(bfs(p1,p2)));
bfw.close();
}
static Integer bfs(int p1, int p2){
int result = 0;
Queue<Integer> q = new LinkedList<>();
q.add(p1);
while(!q.isEmpty()){
int size = q.size();
for(int i=0; i<size; i++){
int cur = q.poll();
visited[cur] = true;
if(cur==p2) return result;
for (int child = 1; child <= n; child++) {
if (map[cur][child] == 1) {
if (!visited[child])
q.add(child);
}
}
}
result++;
}
return -1;
}
}
Reference
この問題について(白駿2644号(Java)), 我々は、より多くの情報をここで見つけました
https://velog.io/@topqr123q/백준-2644번-자바
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
static Integer bfs(int p1, int p2){
int result = 0;
Queue<Integer> q = new LinkedList<>();
q.add(p1);
while(!q.isEmpty()){
int size = q.size();
for(int i=0; i<size; i++){
int cur = q.poll();
visited[cur] = true;
if(cur==p2) return result;
for (int child = 1; child <= n; child++) {
if (map[cur][child] == 1) {
if (!visited[child])
q.add(child);
}
}
}
result++; // 촌수 늘려주기
}
return -1;
}
for(int i=0; i<m; i++){
stk = new StringTokenizer(bfr.readLine());
int parent = Integer.parseInt(stk.nextToken());
int child = Integer.parseInt(stk.nextToken());
map[parent][child] = 1; \\
양 방향 모두!!
map[child][parent] = 1; //
}
import java.util.*;
import java.io.*;
public class boj2644 {
static int n,m, p1,p2;
static int[][] map;
static boolean[] visited;
public static void main(String args[]) throws IOException {
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer stk = new StringTokenizer(bfr.readLine());
n = Integer.parseInt(stk.nextToken());
map = new int[n+1][n+1]; visited = new boolean[n+1];
stk = new StringTokenizer(bfr.readLine());
p1 = Integer.parseInt(stk.nextToken()); p2 = Integer.parseInt(stk.nextToken());
stk = new StringTokenizer(bfr.readLine());
m = Integer.parseInt(stk.nextToken());
for(int i=0; i<m; i++){
stk = new StringTokenizer(bfr.readLine());
int parent = Integer.parseInt(stk.nextToken());
int child = Integer.parseInt(stk.nextToken());
map[parent][child] = 1;
map[child][parent] = 1;
}
bfw.write(String.valueOf(bfs(p1,p2)));
bfw.close();
}
static Integer bfs(int p1, int p2){
int result = 0;
Queue<Integer> q = new LinkedList<>();
q.add(p1);
while(!q.isEmpty()){
int size = q.size();
for(int i=0; i<size; i++){
int cur = q.poll();
visited[cur] = true;
if(cur==p2) return result;
for (int child = 1; child <= n; child++) {
if (map[cur][child] == 1) {
if (!visited[child])
q.add(child);
}
}
}
result++;
}
return -1;
}
}
Reference
この問題について(白駿2644号(Java)), 我々は、より多くの情報をここで見つけました https://velog.io/@topqr123q/백준-2644번-자바テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol