1) 1707번
import java.io.*;
import java.util.*;
public class p1707 {
static int v, e;
static ArrayList<Integer>[] al;
static int visit[];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stz = new StringTokenizer(br.readLine());
int t = Integer.parseInt(stz.nextToken());
for(int tc = 0; tc < t; tc++) {
stz = new StringTokenizer(br.readLine());
v = Integer.parseInt(stz.nextToken());
e = Integer.parseInt(stz.nextToken());
visit = new int[v+1];
al = new ArrayList[v+1];
for(int i = 0; i <= v; i++)
al[i] = new ArrayList<Integer>();
for(int i = 0; i < e; i++) {
stz = new StringTokenizer(br.readLine());
int p1 = Integer.parseInt(stz.nextToken());
int p2 = Integer.parseInt(stz.nextToken());
al[p1].add(p2);
al[p2].add(p1);
}
grouping();
}
}
public static void grouping() {
Queue<Integer> q = new LinkedList<Integer>();
for(int i = 1; i <= v; i++) {
if(visit[i] == 0) {
q.add(i);
visit[i] = 1;
}
while(!q.isEmpty()) {
int now = q.poll();
for(int j = 0; j < al[now].size(); j++) {
if(visit[al[now].get(j)] == 0) {
q.add(al[now].get(j));
}
if(visit[al[now].get(j)] == visit[now]) {
System.out.println("NO");
return;
}
if(visit[now] == 1 && visit[al[now].get(j)] == 0)
visit[al[now].get(j)] = 2;
else if(visit[now] == 2 && visit[al[now].get(j)] == 0)
visit[al[now].get(j)] = 1;
}
}
}
System.out.println("YES");
}
}
2) 1260번
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int[][] arr;
static boolean[] visited;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int N = scan.nextInt(); // 정점의 개수
int M = scan.nextInt(); // 간선의 개수
int V = scan.nextInt(); // 탐색을 시작할 정점 번호
//인접행렬 생성
arr = new int[N+1][N+1];
for(int i = 0; i < M; i++) {
int a = scan.nextInt();
int b = scan.nextInt();
arr[a][b] = 1;
arr[b][a] = 1;
}
visited = new boolean[N + 1];
dfs(V);
System.out.println();
visited = new boolean[N + 1];
bfs(V);
}
//깊이우선탐색(재귀)
public static void dfs(int V) {
visited[V] = true;
System.out.print(V + " ");
if(V == arr.length) {
return;
}
for(int j = 1; j < arr.length; j++) {
//연결은 되어있는데, 방문하지 않았다면 재귀
if(arr[V][j] == 1 && visited[j] == false) {
dfs(j);
}
}
}
//너비우선탐색(큐)
public static void bfs(int V) {
Queue<Integer> que = new LinkedList<Integer>();
que.add(V);
visited[V] = true;
System.out.print(V + " ");
while(!que.isEmpty()) {
int temp = que.poll();
for(int i = 1; i < arr.length; i++) {
if(arr[temp][i] == 1 && visited[i] == false) {
que.add(i);
visited[i] = true;
System.out.print(i + " ");
}
}
}
}
}
3) 2667번
public class ApartNumberingDfs {
private static int dx[] = {0,0,1,-1};
private static int dy[] = {1,-1,0,0};
private static int[] aparts = new int[25*25];
private static int n;
private static int apartNum = 0; //아파트 단지 번호의 수
private static boolean[][] visited = new boolean[25][25]; //방문여부
private static int[][] map = new int[25][25]; //지도
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
map = new int[n][n];
visited = new boolean[n][n];
//전체 사각형 입력 받기
for(int i=0; i<n; i++){
String input = sc.next();
for(int j=0; j<n; j++){
map[i][j] = input.charAt(j)-'0';
}
}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(map[i][j] == 1 && !visited[i][j]){
apartNum++;
dfs(i,j);
}
}
}
Arrays.sort(aparts);
System.out.println(apartNum);
for(int i=0; i<aparts.length; i++){
if(aparts[i] == 0){
}else{
System.out.println(aparts[i]);
}
}
}
private static void dfs(int x, int y) {
visited[x][y] = true;
aparts[apartNum]++;
for(int i=0; i<4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >=0 && ny >=0 && nx < n && ny < n){
if(map[nx][ny] == 1 && !visited[nx][ny]){
dfs(nx,ny);
}
}
}
}
}