본문 바로가기

개발자/Algorithm

C++ 알고리즘 문제 풀이(BFS)

반응형

백준 2606 문제 바이러스

입력

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

출력

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

 

 

문제 해결 방법: BFS
각노드들을 순차적으로 몇번 왔다갔다 하는지 만 보면 된다.최단거리 사용에 유용하나 이 문제에 적용가능

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>

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

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

int coumputer_num; // <= 100
int E; // 네트워크상 직접 연결되어있는 쌍의 수 
using namespace std;
vector <int> a[101];
bool checked[101];

int bfs(int start)
{
	int solution = -1;
	queue<int> q;
	
	q.push(start);

		
	while (!q.empty())
	{
		int x = q.front();

		q.pop();

		for (int i = 0; i<a[x].size() ; i++) //
		{
			sort(a[x].begin(), a[x].end());
			if (checked[a[x][i]] != true)
			{
				q.push(a[x][i]);
				checked[a[x][i]] = true;
				solution++;
			}

		}
	}

	return solution;
}


int main(void)
{
	int count = 0;
	int temp1; //인접행렬 나타내기위한 도구
	int temp2; //인접행렬 나타내기위한 도구
	cin >> coumputer_num;
	cin >> E;

	for (int i = 0;i < E;i++)
	{
		cin >> temp1;
		cin >> temp2;
		a[temp1].push_back(temp2);
		a[temp2].push_back(temp1);

	}

	count = bfs(1);
	printf("%d", count);
	return 0;
}
반응형

'개발자 > Algorithm' 카테고리의 다른 글

DP 동적 프로그래밍 설명 + 예제(타일링 문제)  (0) 2020.08.05
알고 코테 공부 순서  (0) 2020.08.05
Linked List in python  (0) 2020.03.15
파이썬 기초[문자열]  (0) 2020.03.01
백준2231 문제(분해합)  (0) 2020.02.28