โจ ๊ทธ๋ํ ํ์
โจ BFS, ๋ค์ต์คํธ๋ผ โ ์ต๋จ ๊ฒฝ๋ก ์ฐพ๊ธฐ
https://www.acmicpc.net/problem/18352
18352๋ฒ: ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ
์ฒซ์งธ ์ค์ ๋์์ ๊ฐ์ N, ๋๋ก์ ๊ฐ์ M, ๊ฑฐ๋ฆฌ ์ ๋ณด K, ์ถ๋ฐ ๋์์ ๋ฒํธ X๊ฐ ์ฃผ์ด์ง๋ค. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) ๋์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์ ๊ฑธ์ณ์ ๋ ๊ฐ
www.acmicpc.net
๐ ๊ณ ๋ คํด์ผํ ์
- ์ถ๋ฐ ๋์์ ๋ํ ์ ๋ณด๊ฐ ์กด์ฌํ๋ค.
- ์ต๋จ ๊ฑฐ๋ฆฌ์ ๋ํ ์ ๋ณด๊ฐ ์กด์ฌํ๋ค. โ ํด๋นํ๋ ์ต๋จ ๊ฑฐ๋ฆฌ์ธ ๋์๋ฅผ ์ฐพ์ผ๋ฉด ๋๋ค.
- ํ๋์ ๋์์์ ๋ค๋ฅธ ๋ชจ๋ ๋์๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
- ๋์๊ฐ์ ๊ฑฐ๋ฆฌ๊ฐ ๋ชจ๋ 1์ด๊ธฐ ๋๋ฌธ์ BFS๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ์ ์ง๋ ๋๋ง๋ค 1์ฉ ๊ฑฐ๋ฆฌ๋ฅผ ์ฆ๊ฐ์์ผ ๊ตฌํ ์๋ ์๋ค.
๐น๏ธ ํ์ด๊ณผ์
๐น๏ธ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
1๏ธโฃ ๋ ธ๋์ ๋ํ ์ ๋ณด(์ด๋ํด์ผํ๋ ๋ ธ๋, ํด๋นํ๋ ๋ ธ๋๊น์ง ๋๋ฌํ๋๋ฐ ์์๋๋ ๊ฑฐ๋ฆฌ = 1)๋ฅผ ์ ์ฅํ ์ ์๋ ํด๋์ค๊ฐ ํ์ํ๋ค.
2๏ธโฃ ์ถ๋ฐ๋ ธ๋๊ฐ ์ ํด์ ธ์๊ธฐ ๋๋ฌธ์ ์ผ์ฐจ์ dist ๋ฐฐ์ด์ ์์ฑํ๋ค.
3๏ธโฃ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํํด dist ๋ฐฐ์ด์ ์ฑ์ด๋ค.
4๏ธโฃ ์ฑ์์ง dist ๋ฐฐ์ด์์ ๋ฌธ์ ์์ ์๊ตฌํ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๊ณ ์๋ ๋์๋ฒํธ๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅํ๋ค.
๐น๏ธ BFS
1๏ธโฃ ๊ฑฐ๋ฆฌ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ๋ ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐ๋ก ์์ฑํ์ง ์๋๋ค.
2๏ธโฃ ๋ฐฉ๋ฌธ์ฌ๋ถ ํ์์ ๊ฑฐ๋ฆฌ์ ๋ณด ์ ์ฅ์ ๋์์ ์ฒ๋ฆฌํ ์ ์๋๋ก intํ์ visited ๋ฐฐ์ด์ ์์ฑํ๋ค.
3๏ธโฃ ๋ฐฉ๋ฌธํ ๋์์์ visited ๋ฐฐ์ด์ 1 ์ฆ๊ฐ์์ผ ๊ฑฐ๋ฆฌ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
๐ฉ๐ป ์ ์ฒด ์ฝ๋
1๏ธโฃ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
public class BOJ_18352_ํน์ ๊ฑฐ๋ฆฌ์๋์์ฐพ๊ธฐ {
static int N, M, K, X;
static ArrayList<Node>[] city;
static int[] dist;
static boolean[] visit;
static int INF = Integer.MAX_VALUE;
static class Node implements Comparable<Node>{
int y, w;
public Node(int y, int w) {
this.y=y;
this.w=w;
}
@Override
public int compareTo(Node o) {
return this.w-o.w;
}
}
static void dijkstra(int start){
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.add(new Node(start, 0));
dist[start] = 0;
while (!pq.isEmpty()) {
Node now = pq.poll();
if (!visit[now.y]) visit[now.y]=true;
for (int i = 0; i < city[now.y].size(); i++) {
Node next = city[now.y].get(i);
if (!visit[next.y] && dist[next.y] > next.w + now.w) {
dist[next.y] = next.w + now.w;
pq.add(new Node(next.y, dist[next.y]));
}
}
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
X = Integer.parseInt(st.nextToken());
city = new ArrayList[N + 1];
for (int i = 0; i <= N; i++) {
city[i] = new ArrayList<>();
}
dist = new int[N + 1];
visit = new boolean[N + 1];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
city[A].add(new Node(B,1)); // ๊ฑฐ๋ฆฌ๊ฐ ๋ชจ๋ 1
}
Arrays.fill(dist, INF);
dijkstra(X);
boolean flag=false;
for (int i = 1; i <= N; i++) {
if (dist[i] == K) {
System.out.println(i);
flag= true;
}
}
if (!flag) {
System.out.println(-1);
}
}
}
2๏ธโฃ BFS
public class ํน์ ๊ฑฐ๋ฆฌ์๋์์ฐพ๊ธฐ {
static int n,m,k,x;
static int visited[];
static ArrayList<Integer>[] graph;
static List<Integer> ans;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
n = sc.nextInt(); // ๋
ธ๋ ์
m = sc.nextInt(); // ๊ฐ์ ์
k = sc.nextInt(); // ๋ชฉํ ๊ฑฐ๋ฆฌ
x = sc.nextInt(); // ์์์
graph = new ArrayList[n+1]; // ๊ทธ๋ํ ๋ฐ์ดํฐ ์ ์ฅ
ans = new ArrayList<>(); // ์ ๋ต
for (int i=1; i<=n; i++){
graph[i] = new ArrayList<Integer>(); // ๊ทธ๋ํ ๋ฆฌ์คํธ์ ArrayList ์ด๊ธฐํ
}
for (int i=1; i<=m; i++){
int s = sc.nextInt();
int e = sc.nextInt();
graph[s].add(e);
}
visited = new int[n+1]; // ๋ฐฉ๋ฌธ ๋ฐฐ์ด ์ด๊ธฐํ
for(int i=0; i<=n; i++) visited[i] = -1; // ๋ฐฉ๋ฌธ ํ์ + ๊ฑฐ๋ฆฌ์ ๋ณด ์ ์ฅ โ ๋์์ฒ๋ฆฌ ๊ฐ๋ฅ
bfs(x);
for (int i=0; i<=n; i++){
if(visited[i]==k){
ans.add(i);
}
}
if (ans.isEmpty()) {
System.out.println("-1");
} else{
Collections.sort(ans);
for (int temp : ans){
System.out.println(temp);
}
}
}
private static void bfs(int node){
Queue<Integer> queue = new LinkedList<>();
queue.add(node);
visited[node]++; // visited ๋ฐฐ์ด์ ํ์ฌ ๋
ธ๋ ๋ฐฉ๋ฌธ ๊ธฐ๋กํ๊ธฐ
while (!queue.isEmpty()) {
int now = queue.poll();
for (int destination : graph[now]){
// ํ์ ๋ฐ์ดํฐ ์ฝ์
ํ๊ณ visited ๋ฐฐ์ด์ ๋ฐฉ๋ฌธ๊ฑฐ๋ฆฌ ์ ์ฅ
if (visited[destination]==-1){
visited[destination] = visited[now] + 1;
queue.add(destination);
}
}
}
}
}
'์๊ณ ๋ฆฌ์ฆ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 1018 ์ฒด์คํ ๋ค์ ์น ํ๊ธฐ - Java (0) | 2023.12.05 |
---|---|
[BOJ] 1504 ํน์ ํ ์ต๋จ ๊ฒฝ๋ก - Java (0) | 2023.12.05 |
[BOJ] 4179 ๋ถ! - Java (1) | 2023.10.25 |
[BOJ] 14502 ์ฐ๊ตฌ์ - Java (0) | 2023.09.28 |
[BOJ] 3190 ๋ฑ (0) | 2023.09.25 |