https://www.acmicpc.net/problem/16964
16964번: DFS 스페셜 저지
첫째 줄에 정점의 수 N(2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에는 트리의 간선 정보가 주어진다. 마지막 줄에는 DFS 방문 순서가 주어진다. DFS 방문 순서는 항상 N개의 정수로 이루
www.acmicpc.net
[난이도] Gold4
[유형] DFS
[풀이]
인접리스트를 만들 때 vector 대신 set을 이용하면
방문하지 않은 자식 노드들 중에 입력으로 주어진 다음에 방문해야 하는 노드가
있는지를 쉽게 파악할 수 있습니다.
노드가 존재한다면 그 노드를 set에서 제거해주고 다음 노드로 방문해주면 됩니다.
#include <cstdio>
#include <set>
using namespace std;
int idx,N,a[100001];
set<int> adj[100001];
int dfs(int prev,int n){
idx++;
if(adj[n].find(prev) != adj[n].end()) adj[n].erase(prev);
while(!adj[n].empty()){
int v = a[idx];
if(adj[n].find(v) == adj[n].end()) return 0;
adj[n].erase(v);
bool ret = dfs(n,v);
if(!ret) return 0;
}
return 1;
}
int main(){
scanf("%d",&N);
for(int i=0;i<N-1;i++){
int u,v;
scanf("%d%d",&u,&v);
adj[u].insert(v);
adj[v].insert(u);
}
for(int i=0;i<N;i++) scanf("%d",&a[i]);
printf("%d",dfs(0,1));
}
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold4/16964.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Gold4] 14925 : 목장 건설하기 (C++) (0) | 2021.12.18 |
---|---|
[BOJ/백준][Gold4] 13397 : 구간 나누기 2 (C++) (0) | 2021.12.18 |
[BOJ/백준][Gold3] 15711 : 환상의 짝 (C++) (0) | 2021.11.09 |
[BOJ/백준][Gold4] 16957 : 체스판 위의 공 (C++) (0) | 2021.11.09 |
[BOJ/백준][Gold3] 1943 : 동전 분배 (C++) (0) | 2021.11.09 |