728x90
반응형
https://www.acmicpc.net/problem/2606
2606번: 바이러스
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하인 양의 정수이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍
www.acmicpc.net
문제
문제 구현 방향 및 설명
큐를 이용하여 인접리스트로 bfs를 구현해 보았다.
알고리즘은 아래와 같다.
1번 노드 방문
1 |
1번 노드를 큐에서 제거하고 인접한 2번, 5번 노드 추가
2 | 5 |
2번 노드를 빼주고 인접한 3번 노드 추가
5 | 3 |
5번 노드를 빼주고 인접한 6번 노드 추가
3 | 6 |
인접한 노드가 없으므로 빼주기만 함
6 |
인접한 노드가 없으므로 빼주기만 함
큐가 비었으므로 bfs종료
코드 구현
#include <iostream>
#include <queue>
#include<vector>
using namespace std;
//연결리스트로 구현한 bfs
vector<int> list[1000]; //vector를 배열로 만들어 주면 무방향 그래프를 구현할 수 있다.
bool visit[1000]; //방문한 노드 표시용 배열
int cnt = 0; //전파된 컴퓨터를 세주기 위한 cnt
void bfs(int start) {
queue<int> q; // 큐에 넣고 visit을 true로 만들고 시작한다.
q.push(start);
visit[start] = true;
while (!q.empty()) { //큐가 빌때까지 반복해 준다.
int x = q.front();
q.pop();
for (int i = 0; i < list[x].size(); i++) {
int y = list[x][i];
if (!visit[y]) {
visit[y] = true; //방문했다면 true로 만들어 준다.
q.push(y); //그리고 큐에 넣어준다.
}
}
}
for (int i = 0; i < sizeof(visit) / sizeof(visit[0]); i++) { //방문한 곳의 개수를 세어준다.
if (visit[i]) {
cnt++;
}
}
cout << cnt-1; //1번 컴퓨터를 제외하고 전파된 컴퓨터의 개수
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int num, info, i, u, v;
cin >> num;
cin >> info;
for (i = 0; i < info; i++) {
cin >> u >> v;
list[u].push_back(v);
list[v].push_back(u);
}
bfs(1); //1번 컴퓨터부터 시작
}
반응형
'백준 문제풀이' 카테고리의 다른 글
[백준] 1325 효율적인 해킹 c++ 구현 (0) | 2024.02.07 |
---|---|
[백준] 1303 전쟁-전투 c++ 구현 (1) | 2024.02.06 |
[백준] 10866 덱 c++ 구현 (0) | 2024.02.04 |
[백준] 5430 AC c++ 구현 (0) | 2024.02.04 |
[백준] 2374 같은 수로 만들기 c++ 구현 (0) | 2024.01.30 |