#include <stdio.h>
#include <vector>
using namespace std;
void dfs(int computer, vector<int> *graph, bool *check, vector<int> *worm){
check[computer]=true; //๋ฐฉ๋ฌธ ์ฒดํฌ
for(int i = 0; i < graph[computer].size(); i++){ //๊ฐ์ผ๋ ์ปดํจํฐ์ ์ฐ๊ฒฐ๋ ์ปดํจํฐ๋ ๊ฐ์ผ์ด๋ฏ๋ก
int next = graph[computer][i];
if(check[next] == false){
(*worm).push_back(next); //0ํฌํจ ์๋๋๋ก..
dfs(next, graph, check, worm);
}
}
}
int main()
{
int n,m; //n: ์ ์ ์ ์, m: ๊ฐ์ ์ ์
scanf("%d", &n);
scanf("%d", &m);
vector<int> graph[n];
vector<int> worm_computer;
bool check[n];
fill(check, check+n, false);
for(int i=0; i<m; i++)
{
int u,v; //๋คํธ์ํฌ ์์์ ์ง์ ์ฐ๊ฒฐ๋์ด ์๋ ์ปดํจํฐ์ ๋ฒํธ ์
scanf("%d %d", &u, &v);
//์๋ฐฉํฅ ๊ทธ๋ํ
graph[u-1].push_back(v-1);
graph[v-1].push_back(u-1);
}
dfs(0, graph, check, &worm_computer);
printf("%d", worm_computer.size());
}
์ ์ ์ ๊ฐ์(n)๋งํผ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ vector ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ค.
ํ์์ ๊ฒฝ์ฐ, 1๋ฒ ์ปดํจํฐ๊ฐ 0๋ฒ์งธ๋ถํฐ ๋ค์ด๊ฐ๋๋ก ๋ง๋ค์๋ค.
graph[i]๋ i๋ฒ์งธ ์ ์ ์ ์ฐ๊ฒฐ๋ ์ ์ ๋ค์ด ๋ด๊ธด๋ค.
์๋ฐฉํฅ ๊ทธ๋ํ์ด๋ฏ๋ก, ๋คํธ์ํฌ ์ ์ง์ ์ฐ๊ฒฐ๋์ด ์๋ ์ปดํจํฐ์ ๋ฒํธ ์์ ๋ฐ๋ผ vector์ ๊ฐ์ ๋ฃ์ด์ค ๋ (u,v) ์ ์ ์ ๋ํด graph[u-1]์ ๋ฃ์ด์ฃผ๊ณ , graph[v-1]์๋ ๋ฃ์ด์ค๋ค.
DFS ํ์์ ์ฌ๊ทํจ์๋ก ๊ตฌํํด์, ๊ฐ ์ปดํจํฐ์ ์ฐ๊ฒฐ๋ ์ปดํจํฐ์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ปดํจํฐ๊ฐ ๊ณ ๋ ค๋๋๋ก ํ๋ค.
๋จผ์ visited๋ก ํ์ ์ ๋ฌด๋ฅผ ํ๋จํ๋ค. ์๋ฐฉํฅ ๊ทธ๋ํ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ปดํจํฐ๋ฅผ ๋ค์ ํ์ํ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํจ์ ์ฒ์์ visited๋ฅผ true๋ก ํ๊ณ , ํด๋น ์ปดํจํฐ์ ์ฐ๊ฒฐ๋ ์์๋ค์ ๋ํด ๋ค์ ํ์ํ ์ปดํจํฐ๋ฅผ next๋ก ๊ฐ์ง๊ณ ๋ง์ฝ check[next]๊ฐ false์ด๋ฉด ๋ฐฉ๋ฌธํ์ง ์์ ์ปดํจํฐ์ด๋ฏ๋ก ํ์ํ๋ค.
dfs ํจ์ ์ด๋ฐ์ vector์ ๋ฃ๋ ์์ ์ ํ๋ฉด ๋งจ ์ฒ์์ ๋ฐฉ๋ฌธํ๋ 1๋ฒ ์ปดํจํฐ๊ฐ vector์ ํฌํจ๋๊ฒ ๋๋ฏ๋ก, ๋ฐฉ๋ฌธํ์ง ์์ ์ปดํจํฐ์ธ ์กฐ๊ฑด์ผ ๋์ vector์ ๋ฃ์ด์ค๋ค.
#include <stdio.h>
#include <vector>
using namespace std;
void dfs(int computer, vector<int> *graph, bool *check, vector<int> *worm){
check[computer]=true; //๋ฐฉ๋ฌธ ์ฒดํฌ
//(*worm).push_back(computer); //๊ฐ์ผ๋ ์ปดํจํฐ vector์ ๋ฃ์
printf("[+] %d INFECTED\n", computer);
for(int i = 0; i < graph[computer].size(); i++){ //๊ฐ์ผ๋ ์ปดํจํฐ์ ์ฐ๊ฒฐ๋ ์ปดํจํฐ๋ ๊ฐ์ผ์ด๋ฏ๋ก
int next = graph[computer][i];
if(check[next] == false){
(*worm).push_back(next); //1๋ฒ ์ปดํจํฐ ํฌํจ ์๋๋๋ก..
dfs(next, graph, check, worm);
}
}
}
int main()
{
int n,m; //n: ์ ์ ์ ์, m: ๊ฐ์ ์ ์
scanf("%d", &n);
scanf("%d", &m);
vector<int> graph[n];
vector<int> worm_computer;
bool check[n];
fill(check, check+n, false);
for(int i=0; i<m; i++)
{
int u,v; //๋คํธ์ํฌ ์์์ ์ง์ ์ฐ๊ฒฐ๋์ด ์๋ ์ปดํจํฐ์ ๋ฒํธ ์
scanf("%d %d", &u, &v);
//์๋ฐฉํฅ ๊ทธ๋ํ
graph[u-1].push_back(v-1);
graph[v-1].push_back(u-1);
}
dfs(0, graph, check, &worm_computer); //1๋ฒ ์ปดํจํฐ๋ถํฐ ๋ฐฉ๋ฌธ ์์
printf("\ninfected computers: ");
for(int c: worm_computer) printf("%d ", c);
printf("\n# of infected: %d", worm_computer.size());
}
5
4
1 3
1 4
2 5
3 2
๋ฌธ์ ๋ฅผ ํ ๋ ์๊ฐํ์ง ๋ชปํ ๋ฐ๋ก๋ ์์ ๊ฐ๋ค.
[๋ฐฑ์ค(BOJ)] 1260๋ฒ: DFS์ BFS (C++) (0) | 2021.01.22 |
---|---|
[๋ฐฑ์ค(BOJ)] 3273๋ฒ: ๋ ์์ ํฉ (Two Pointers Algorithm, C++) (0) | 2021.01.22 |
[๋ฐฑ์ค(BOJ)] 5585๋ฒ: ๊ฑฐ์ค๋ฆ๋ (๊ทธ๋ฆฌ๋(Greedy) ์๊ณ ๋ฆฌ์ฆ, C++) (0) | 2021.01.20 |
[HackerRank] Alternating Characters (String Manipulation) (C++, Python) (0) | 2021.01.17 |
[HackerRank] Strings: Making Anagrams (String Manipulation) (C++) (0) | 2021.01.17 |