⛔ 단순히 기록용 입니다... 어떻게 풀었는가 생각도 다시 해보고 그러니까 아마도 도움은 안되실 것 같습니다.
BFS를 이용해서 각 각의실마다 그룹을 나눠서 등록해두면 됩니다. 그 이후, 강의실을 돌아다니면서 몇번 바깥을 나가게 되는지를 알아볼 수 있습니다.
아래는 정답 코드입니다.
#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
#define MAX 100005
using namespace std;
vector<int> code,adj[MAX];
int answer = 0,n,m,lecture[MAX],visited[MAX];
void init(){
cin >> n >> m;
int from,to;
for(int i = 0; i < m; i++){
cin >> from >> to;
adj[from].push_back(to);
adj[to].push_back(from);
}
int number;
for(int i = 0; i < n; i++){
cin >> number;
code.push_back(number);
}
}
void move(int start, int idx) {
queue<int> q;
q.push(start);
lecture[start] = idx;
while(!q.empty()){
int from = q.front();
q.pop();
for(int i = 0; i < adj[from].size(); i++){
int to = adj[from][i];
if(!lecture[to]){
lecture[to] = idx;
q.push(to);
}
}
}
}
void bfs() {
memset(lecture, 0, sizeof(lecture));
for(int i = 0; i < n; i++){
if(lecture[code[i]]) continue;
move(code[i], i+1);
}
}
void solve() {
int current = lecture[code[0]];
for(int i = 1; i < n; i++){
if(current != lecture[code[i]]){
answer++;
current = lecture[code[i]];
}
}
cout << answer;
}
int main(){
init();
bfs();
solve();
return 0;
}
'PS > BaekJoon' 카테고리의 다른 글
[C++/1749] 점수 따먹기 (0) | 2024.08.01 |
---|---|
[C++/13333] Q-인덱스 (0) | 2024.07.29 |
[C++/17089] 세친구 (0) | 2024.07.23 |
[C++/23843] 콘센트 (1) | 2024.07.23 |
[C++/20002] 사과나무 (0) | 2024.07.22 |