문제
Bessie는 정점이 1부터 N까지 라벨이 붙은 간단한 무방향 그래프를 가지고 있습니다. 그녀는 그래프의 깊이 우선 탐색(DFS) 순서를 생성하려고 합니다. DFS 순서는 다음과 같은 C++ 코드로 정의된 dfs(1)을 호출하여 생성됩니다.
vector<bool> vis(N + 1);
vector<vector<int>> adj(N + 1); // 인접 리스트
vector<int> dfs_order;
void dfs(int x) {
if (vis[x]) return;
vis[x] = true;
dfs_order.push_back(x);
for (int y : adj[x]) dfs(y);
}
각 정점에 대해 인접 리스트(adj[i] for all 1≤i≤N)가 주어지며, 이 리스트는 DFS를 시작하기 전에 임의로 순서를 변경할 수 있습니다. 그래서 같은 그래프라도 여러 개의 가능한 DFS 순서를 가질 수 있습니다.
그래프의 초기 상태와 각 간선의 상태를 변경하는 비용이 주어집니다. 즉, 각 두 정점 (i, j)에 대해 다음과 같은 조건이 주어집니다.
만약 ai,j > 0이라면, 간선 (i,j)는 현재 그래프에 없고, 추가하는 데 ai,j 만큼의 비용이 듭니다.
만약 ai,j < 0이라면, 간선 (i,j)는 현재 그래프에 있으며, 제거하는 데 −ai,j 만큼의 비용이 듭니다.
이 문제의 목표는 그래프의 상태를 변경하여 [1, 2, ..., N] 순서가 가능한 DFS 순서를 만들 수 있도록 최소 비용을 구하는 것입니다.
입력
첫 번째 줄에는 정점의 수
그 다음
출력
첫 줄에 그래프를 변경하는 최소 비용을 출력한다.
부분문제
번호 | 점수 | 조건 |
---|---|---|
#1 | 20점 | |
#2 | 30점 | |
#3 | 50점 | 추가 제약 조건 없음 |
예제1
4
1
2 3
40 6 11
10
처음에는 그래프에 간선이 없습니다. (1,2), (2,3), (2,4)를 추가할 수 있으며, 총 비용은 1+3+6입니다. 이제 그래프는 두 가지 가능한 DFS 순서인 [1,2,3,4]와 [1,2,4,3]을 가질 수 있습니다.
예제2
5
-1
10 -2
10 -7 10
-6 -4 -5 10
5
처음에는 그래프에 간선 (1,2), (2,3), (2,4), (1,5), (2,5), (3,5)가 있습니다. 간선 (3,5)는 비용 5로 제거할 수 있습니다.
예제3
4
-1
-2 300
4 -5 6
9
처음에는 그래프에 간선 (1,2), (1,3), (2,4)가 있습니다. 간선 (2,4)는 제거할 수 있고, 간선 (1,4)는 추가할 수 있습니다. 총 비용은 5 + 4 = 9입니다.