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 |