본문 바로가기

Algorithm/BOJ

2606 - 바이러스 (연결그래프, DFS 스택 구현)

반응형

바이러스 성공

시간 제한메모리 제한제출정답맞은 사람정답 비율

1 초 128 MB 26258 10975 7587 40.505%

문제

신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.

예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.

어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.

출력

1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.

 


1번 컴퓨터와 연결된 모든 요소를 찾아내면 된다.

BFS혹은 DFS를 사용하면 모든 연결 요소를 확인할 수 있다.

코드에선 재귀함수 콜스택 없이 Stack을 활용한 DFS를 구현하였다.

재귀함수를 사용할경우에는 함수 콜스택이 방문중인 정점을 누적해서 적재하게 된다.

특별히 고려해야할 점은 실제 함수가 호출될때, 스택에는 레지스터값과 지역변수와 같은 context가 할당된다.

마찬가지로, 사용되는 스택에도 연결노드를 순차적으로 확인할때 사용하던 변수를 할당하면, 연결 노드를 확인하는 작업에서 불필요한 중복 연산을 줄일 수 있다.


#include <iostream>
#include <stack>
#include <vector>

using namespace std;

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int n, e;
	cin >> n >> e;
	vector<vector<int>> a(n + 1);
	vector<bool> check(n + 1, false);
	int cnt = 0;
	for (int i = 0; i < e; i++)
	{
		int s, d;
		cin >> s >> d;
		a[s].push_back(d);
		a[d].push_back(s);
	}

	stack <pair<int, int>>st;
	st.push(make_pair(1, 0));

	while (!st.empty())
	{
		bool _flag = false;
		int now = st.top().first;
		int loc = st.top().second;
		check[now] = true;
		int sz = a[now].size();

		for (; loc < sz; loc++)
		{
			int next = a[now][loc];
			if (check[next] == true) continue;
			st.top().second = loc + 1;
			st.push(make_pair(next, 0));
			cnt++;
			_flag = true;
			break;
		}
		if (_flag)
			continue;
		else
			st.pop();
	}
	cout << cnt << '\n';
	return 0;
}
반응형

'Algorithm > BOJ' 카테고리의 다른 글

1525-퍼즐 (BFS, 플러드필)  (0) 2019.01.28
9019 - DSLR (BFS, 플러드 필)  (0) 2019.01.26
2225-합분해 (DP 최적화)  (0) 2019.01.20
BOJ 1924 - 2007년 DP(memoization) 초기화  (0) 2019.01.10