๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[๋ฐฑ์ค€] 5567๋ฒˆ_์•Œ๊ณ ๋ฆฌ์ฆ˜_๊ทธ๋ž˜ํ”„_๊ฒฐํ˜ผ์‹

https://www.acmicpc.net/problem/5567

 

5567๋ฒˆ: ๊ฒฐํ˜ผ์‹

์˜ˆ์ œ 1์˜ ๊ฒฝ์šฐ 2์™€ 3์€ ์ƒ๊ทผ์ด์˜ ์นœ๊ตฌ์ด๋‹ค. ๋˜, 3๊ณผ 4๋Š” ์นœ๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์—, 4๋Š” ์ƒ๊ทผ์ด์˜ ์นœ๊ตฌ์˜ ์นœ๊ตฌ์ด๋‹ค. 5์™€ 6์€ ์นœ๊ตฌ๋„ ์•„๋‹ˆ๊ณ , ์นœ๊ตฌ์˜ ์นœ๊ตฌ๋„ ์•„๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 2, 3, 4 3๋ช…์˜ ์นœ๊ตฌ๋ฅผ ๊ฒฐํ˜ผ์‹์— ์ดˆ๋Œ€

www.acmicpc.net

๋ฌธ์ œ

์ƒ๊ทผ์ด๋Š” ์ž์‹ ์˜ ๊ฒฐํ˜ผ์‹์— ํ•™๊ต ๋™๊ธฐ ์ค‘ ์ž์‹ ์˜ ์นœ๊ตฌ์™€ ์นœ๊ตฌ์˜ ์นœ๊ตฌ๋ฅผ ์ดˆ๋Œ€ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ƒ๊ทผ์ด์˜ ๋™๊ธฐ๋Š” ๋ชจ๋‘ N๋ช…์ด๊ณ , ์ด ํ•™์ƒ๋“ค์˜ ํ•™๋ฒˆ์€ ๋ชจ๋‘ 1๋ถ€ํ„ฐ N๊นŒ์ง€์ด๋‹ค. ์ƒ๊ทผ์ด์˜ ํ•™๋ฒˆ์€ 1์ด๋‹ค.

์ƒ๊ทผ์ด๋Š” ๋™๊ธฐ๋“ค์˜ ์นœ๊ตฌ ๊ด€๊ณ„๋ฅผ ๋ชจ๋‘ ์กฐ์‚ฌํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ฒฐํ˜ผ์‹์— ์ดˆ๋Œ€ํ•  ์‚ฌ๋žŒ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ฒซ์งธ ์ค„์— ์ƒ๊ทผ์ด์˜ ๋™๊ธฐ์˜ ์ˆ˜ n (2 ≤ n ≤ 500)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด m (1 ≤ m ≤ 10000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ m ๊ฐœ ์ค„์—๋Š” ์นœ๊ตฌ ๊ด€๊ณ„ ai bi๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ ai < bi ≤ n) ai์™€ bi๊ฐ€ ์นœ๊ตฌ๋ผ๋Š” ๋œป์ด๋ฉฐ, bi์™€ ai๋„ ์นœ๊ตฌ๊ด€๊ณ„์ด๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ ์˜ˆ์‹œ

6 5 1 2 1 3 3 4 2 3 4 5

๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ ์ž…๋ ฅํ•œ๋‹ค๋ฉด,

์ƒ๊ทผ์ด(1)๊ณผ 2๋Š” ์นœ๊ตฌ,

์ƒ๊ทผ์ด(1)๊ณผ 3์€ ์นœ๊ตฌ,

3๊ณผ 4๋Š” ์นœ๊ตฌ,

2์™€ 3์€ ์นœ๊ตฌ,

4์™€ 5๋Š” ์นœ๊ตฌ์ด๋‹ค.

โ€‹

๋ฌธ์ œ์—์„œ๋Š” ์ƒ๊ทผ์ด์˜ ์นœ๊ตฌ, ๊ทธ ์นœ๊ตฌ์˜ ์นœ๊ตฌ๊นŒ์ง€๊ฐ€ ๋ช‡ ๋ช…์ธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ์›ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์˜ˆ์‹œ๊ฐ€ ์œ„์™€ ๊ฐ™๋‹ค๋ฉด, ์ƒ๊ทผ์ด์˜ ์นœ๊ตฌ์ธ 2์™€ 3, ๊ทธ๋ฆฌ๊ณ  2์™€ 3, 3์˜ ์นœ๊ตฌ์ธ 4๊นŒ์ง€ ํฌํ•จํ•˜์—ฌ 2,3,4๋ฒˆ ์ด 3๋ช…์ด๋‹ค.


๊ทธ๋ž˜ํ”„

์ด ๋ฌธ์ œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.

๊ทธ๋ž˜ํ”„๋ž€, ์–ด๋–ค ์ž๋ฃŒ๋‚˜ ๊ฐœ๋…์„ ํ‘œํ˜„ํ•˜๋Š” ์ •์ ๋“ค์˜ ์ง‘ํ•ฉ V์™€ ์ด๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ„์„ ๋“ค์˜ ์ง‘ํ•ฉ E๋กœ ๊ตฌ์„ฑ๋œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งํ•œ๋‹ค.

๋นจ๊ฐ„ ์„ ์„ ๊ฐ„์„  edge ๋˜๋Š” link๋ผ๊ณ  ํ•œ๋‹ค. ์ดˆ๋ก ์›์„ ์ •์  vertex ๋˜๋Š” node๋ผ๊ณ  ํ•œ๋‹ค.

์ด ๊ทธ๋ž˜ํ”„๋กœ ํ˜„์‹ค ์„ธ๊ณ„์˜ ์‚ฌ๋ฌผ์ด๋‚˜ ์ถ”์ƒ์ ์ธ ๊ฐœ๋… ๊ฐ„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ˜„์‹ค ์„ธ๊ณ„์˜ ์‚ฌ๋ฌผ์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„์˜ ์˜ˆ๋กœ๋Š” ์ด๋ฒˆ์— ํ’€์ดํ•  ๋ฐฑ์ค€ ๊ฒฐํ˜ผ์‹ ๋ฌธ์ œ์ด๋‹ค.

์ถ”์ƒ์ ์ธ ๊ฐœ๋… ๊ฐ„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„์˜ ์˜ˆ๋กœ๋Š” ๋งˆ์ธ๋“œ๋งต์ด ์žˆ๋‹ค.

โ€‹

๊ทธ๋ž˜ํ”„ ๊ธฐ๋ณธ ์šฉ์–ด

- ์ธ์ ‘

์œ„ ๊ทธ๋ฆผ์—์„œ ์ •์  1๊ณผ ์ •์  2๋Š” ์ธ์ ‘ํ•ด์žˆ๋‹ค. ๋˜ ์ •์  2์™€ 4๋„ ์ธ์ ‘ํ•ด์žˆ๋‹ค.

'์ธ์ ‘ํ•˜๋‹ค'๋ผ๋Š” ์˜๋ฏธ๋Š” ์ •์ ๊ณผ ์ •์ ์ด ๊ฐ„์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„ ๋•Œ๋ฅผ ๋งํ•œ๋‹ค.

โ€‹

-์ˆœํ™˜

์œ„ ๊ทธ๋ฆผ์—์„œ ์ •์  1, ์ •์  2, ์ •์  3์€ ์ˆœํ™˜์ด๋‹ค.

'์ˆœํ™˜'์ด๋ผ๋Š” ์˜๋ฏธ๋Š” ํ•˜๋‚˜์˜ ์ •์ ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ๋ช‡ ๊ฐœ์˜ ์ •์ ๋“ค์„ ๊ฑฐ์ณ ๋‹ค์‹œ ์ฒ˜์Œ์˜ ์ •์ ์œผ๋กœ ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ์„ ๋•Œ๋ฅผ ๋งํ•œ๋‹ค.

๊ทธ๋ž˜ํ”„์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

1. ์ธ์ ‘ ํ–‰๋ ฌ

i, j
1
2
3
1
0
1
1
2
1
0
0
3
1
0
0

์œ„ ํ‘œ๋ฅผ ํ•ด์„ํ•˜๋ฉด,

1๊ณผ 1์€ ์ธ์ ‘ํ•˜์ง€ ์•Š์•„ 0, 1๊ณผ 2๋Š” ์ธ์ ‘ํ•˜์—ฌ 1, 1๊ณผ 3์€ ์ธ์ ‘ํ•˜์—ฌ 1์ด๋‹ค.

2์™€ 1์€ ์ธ์ ‘ํ•˜์—ฌ 1, 2์™€ 2๋Š” ์ธ์ ‘ํ•˜์ง€ ์•Š์•„ 0, 2์™€ 3์€ ์ธ์ ‘ํ•˜์ง€ ์•Š์•„ 0์ด๋‹ค.

3๊ณผ 1์€ ์ธ์ ‘ํ•˜์—ฌ 1, 3๊ณผ 2๋Š” ์ธ์ ‘ํ•˜์ง€ ์•Š์•„ 0, 3๊ณผ 3์€ ์ธ์ ‘ํ•˜์ง€ ์•Š์•„ 0์ด๋‹ค.

โ€‹

์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•œ๋‹ค๋ฉด,

ํ–‰๋ ฌ ์ด๋ฆ„์ด a์ด๊ณ , ํ–‰์€ j, ์—ด์€ j์ด๋‹ค.

ํ–‰ i์™€ ์—ด j๊ฐ€ ์ธ์ ‘ํ•œ๋‹ค๋ฉด, a[i][j] = 1์ด๊ณ ,

ํ–‰ i์™€ ์—ด j๊ฐ€ ์ธ์ ‘ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, a[i][j] = 0์ด๋‹ค.

โ€‹

- ์žฅ์ 

์ธ์ ‘ํ•˜๋Š”์ง€, ์ธ์ ‘ํ•˜์ง€ ์•Š์€์ง€ ์‰ฝ๊ฒŒ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

- ๋‹จ์ 

์‹ค์ œ๋กœ ์ธ์ ‘ํ•œ ์–‘๊ณผ ์ƒ๊ด€์—†์ด ๋ถˆํ•„์š”ํ•œ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•œ๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค.

โ€‹

2. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ

โ€‹

๋ฆฌ์ŠคํŠธ๋Š” a, ์ •์ ์˜ ์ˆ˜๋Š” n์ด๋‹ค.

a[n]์—์„œ a[i]๋Š” ์ •์  i๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฐ„์„ ์— ์—ฐ๊ฒฐ๋œ ์ •์ ์„ ์—ฐ๊ฒฐํ•˜๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘์ด๋‹ค.

โ€‹

- ์žฅ์ 

์‹ค์ œ ๊ฐ„์„  ์ˆ˜๋งŒํผ์˜ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

- ๋‹จ์ ‘

์ธ์ ‘ํ•˜๋Š”์ง€, ์ธ์ ‘ํ•˜์ง€ ์•Š์€์ง€ ์ผ์ผ์ด ์ฐพ์•„์•ผ ํ•œ๋‹ค.


์ฝ”๋“œ ์„ค๋ช…

1. call by reference

โ€‹

void connect(int& a, int& b);

โ€‹

ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ๋ฐฉ์‹์—๋Š” call by reference์™€ call by value๊ฐ€ ์žˆ๋‹ค.

call by value๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, ๋ฉ”๋ชจ๋ฆฌ์— ๋ณ„๋„์˜ ์ž„์‹œ ๊ณต๊ฐ„์ด ์ƒ์„ฑ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜์—์„œ ์ธ์ž์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ์›๋ž˜ ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

call by reference๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, ๋ฉ”๋ชจ๋ฆฌ์— ๋ณ„๋„์˜ ์ž„์‹œ ๊ณต๊ฐ„์ด ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ  ์›๋ž˜ ์žˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฎ์–ด์“ด๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜์—์„œ ์ธ์ž์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด, ๋‹ค๋ฅธ ํ•จ์ˆ˜์—์„œ๋„ ๊ทธ ์ธ์ž์˜ ๊ฐ’์ด ๋ชจ๋‘ ๋ณ€๊ฒฝ๋œ๋‹ค.

โ€‹

2. ์ธ์ ‘ ํ–‰๋ ฌ

โ€‹

cin >> a >> b;

friends[a][b] = 1;

friends[b][a] = 1;

โ€‹

์ž…๋ ฅ๋ฐ›์€ a์™€ b๋Š” ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ friends ํ–‰๋ ฌ์— 1์„ ๋‹ด๋Š”๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž…๋ ฅ๋ฐ›์€ b์™€ a๋„ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ friends ํ–‰๋ ฌ์— 1์„ ๋‹ด๋Š”๋‹ค.

โ€‹

3.

โ€‹

if (check[i] == 1)

connectedCount++;

โ€‹

์ธ์ ‘ํ•œ๋‹ค๋ฉด connectedCount๋ฅผ 1์„ ๋”ํ•œ๋‹ค.โ€‹

โ€‹

4.

โ€‹

for (int a = 2; a <= n; a++)

โ€‹

1์€ ์ƒ๊ทผ์ด๋ฏ€๋กœ, 2๋ถ€ํ„ฐ n๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

โ€‹

5.

โ€‹

if (friends[1][a])

{

check[a] = 1;

for (int b = 2; b <= n; b++)

{

if (friends[a][b] == 1) check[b] = 1;

}

}

โ€‹

๋งŒ์•ฝ 1(์ƒ๊ทผ์ด)์™€ a๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด, check ๋ฐฐ์—ด์˜ a ๋ฒˆ ์งธ index์— 1์„ ๋‹ด๋Š”๋‹ค.

๊ทธ ํ›„, a์™€ ์—ฐ๊ฒฐ๋œ ์ •์  b๊ฐ€ ์žˆ๋‹ค๋ฉด check ๋ฐฐ์—ด b ๋ฒˆ ์งธ index์— 1์„ ๋‹ด๋Š”๋‹ค.

โ€‹

6.

โ€‹

for (int i = 2; i <= n; i++)

{

if (check[i]) connectedCount++;

}

โ€‹

check์˜ i ๋ฒˆ ์งธ index๊ฐ€ 1์ด๋ฉด 1์€ true๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ, if ๋ฌธ์„ ์‹คํ–‰ํ•œ๋‹ค.

connectedCount๋Š” 1๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ •์ ์˜ ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ฝ”๋“œ

#include<iostream>
using namespace std;

int n, m, a, b, connectedCount = 0;
int friends[501][501];
int check[501];

void connect(int& a, int& b);

int main()
{
	cin >> n >> m;

	for (int i = 0; i < m; i++)
	{
		cin >> a >> b;
		friends[a][b] = 1;
		friends[b][a] = 1;
	}

	connect(a, b);

	for (int i = 2; i <= n; i++)
	{
		if (check[i]) connectedCount++;
	}

	cout << connectedCount << endl;
}

void connect(int& a, int& b)
{
	for (int a = 2; a <= n; a++)
	{
		if (friends[1][a])
		{
			check[a] = 1;
			for (int b = 2; b <= n; b++)
			{
				if (friends[a][b] == 1) check[b] = 1;
			}
		}
	}
}
 

โ€‹