만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

깊이 우선 탐색

시간 제한6초메모리 제한1024 MB

요약
트리 T에 추가 간선 m개 중 일부를 더했을 때, T가 특별한 정점 중 하나에서 시작한 DFS 트리가 되는 부분집합의 수를 셉니다.
난이도

어려움10점 중 8점

유형
트리, DFS, 동적 계획법, 조합론
정답자
아직 제출이 없습니다

문제

깊이 우선 탐색은 널리 쓰이는 탐색 알고리즘이다. 이 알고리즘으로 자기 루프와 중복 간선이 없는 무방향 연결 그래프 G=(V,E)G = (V,E)와 시작점 ss에서 트리 TT를 얻을 수 있다.

알고리즘은 다음과 같이 동작한다.

  • 스택 SS를 비우고, T=(V,∅)T = (V, \emptyset)로 둔다. 즉 TT의 간선 집합은 처음에 비어 있다.
  • 시작점 ss를 SS에 넣는다.
  • 스택의 맨 위 정점 uu를 확인하고, uu를 방문함으로 표시한다.
  • uu와 인접하면서 아직 방문하지 않은 정점 vv가 있으면, 그중 하나를 임의로 골라 (u,v)(u, v)를 TT의 간선 집합에 추가한다. 그다음 vv를 SS에 넣고 3번 단계로 돌아간다. 그런 정점이 없으면 uu를 스택에서 뺀다.

GG가 연결 그래프이면 이 알고리즘은 GG의 신장 트리 TT를 하나 얻는다. 다만 4번 단계에서 어느 정점을 고르느냐, 즉 탐색 순서에 따라 얻는 트리는 하나로 정해지지 않는다. 알고리즘이 얻는 트리가 정확히 TT가 되도록 하는 탐색 순서가 존재하면, TT를 시작점 ss에 대한 ss-DFS 트리라고 부른다.

nn개의 정점에 11부터 nn까지 번호가 붙은 트리 TT와 추가 간선 mm개가 주어진다. 이 mm개의 간선은 서로 다르고, 양 끝점이 서로 다른 정점이며, TT의 n−1n-1개 트리 간선과도 다르다고 보장된다. 이 추가 간선을 비트리 간선이라고 부른다. nn개의 정점 중 정확히 kk개를 특수 정점으로 지정한다.

비트리 간선의 부분집합을 고르는 방법의 수를 구한다. 고른 비트리 간선을 TT의 트리 간선과 합쳐 그래프 GG를 만들었을 때, TT가 ss-DFS 트리가 되도록 하는 특수 정점 ss가 존재해야 한다. 비트리 간선을 하나도 고르지 않아도 된다.

답이 매우 클 수 있으므로 (109+7)(10^9+7)로 나눈 나머지를 출력한다.

입력

입력의 첫 줄에 테스트 케이스 번호 cc가 주어진다. c=0c = 0이면 이 테스트 케이스는 예제 테스트이다.

둘째 줄에 정점 수 nn, 비트리 간선 수 mm, 특수 정점 수 kk가 양의 정수로 주어진다.

이어서 n−1n-1개의 줄에 트리 TT의 간선 u,vu, v가 한 줄에 하나씩 주어진다. 이 간선들이 트리를 이룬다고 보장된다.

이어서 mm개의 줄에 비트리 간선 a,ba, b가 한 줄에 하나씩 주어진다. (a,b)(a, b)는 트리 간선과 겹치지 않으며, 중복된 간선도 없다고 보장된다.

마지막 줄에는 특수 정점의 번호 s1,s2,...,sks_1, s_2, ..., s_k가 주어진다. 이 번호들은 서로 다르다.

출력

답을 한 줄에 출력한다. 답은 (109+7)(10^9+7)로 나눈 나머지이다.

제한

모든 테스트 데이터에 대해 1≤k≤n≤5⋅1051 \leq k \leq n \leq 5\cdot 10^5, 1≤m≤5⋅1051 \leq m \leq 5\cdot 10^5이 보장된다.

예제1

  1. 예제 1

    입력
    0
    4 2 2
    1 2
    2 3
    3 4
    1 3
    2 4
    2 3
    
    예상 출력
    3