| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1314529 | germanman | The Xana coup (BOI21_xanadu) | Java | 0 ms | 0 KiB |
import java.io.*;
import java.util.*;
public class Main {
static int[] head;
static int[] to;
static int[] next;
static int[] black;
static int INF;
public static void main(String[] args) throws IOException {
PrintWriter out = new PrintWriter(System.out);
FastScanner fs = new FastScanner();
int N = fs.nextInt();
head = new int[N + 1];
to = new int[N* 2];
black = new int[N + 1];
next = new int[N * 2];
Arrays.fill(head, -1);
INF = N + 1;
for(int i = 0; i < N - 1; i++) {
int u = fs.nextInt(), v = fs.nextInt();
addEdge(i, u, v);
addEdge(N + i, v, u);
}
for(int i = 1; i <= N; i++) {
black[i] = fs.nextInt();
}
boolean[] visited = new boolean[N + 1];
visited[1] = true;
int[][][] dp = new int[N + 1][2][2];
dp(1, visited, dp);
int min = Math.min(dp[1][0][0], dp[1][0][1]);
if(min >= INF) {
out.print("impossible");
}else {
out.print(min);
}
out.flush();
}
private static void dp(int curr, boolean[] visited, int[][][] dp) {
dp[curr][0][0] = black[curr] == 1 ? INF : 0;
dp[curr][0][1] = black[curr] == 1 ? 1 : INF;
dp[curr][1][0] = black[curr] == 1 ? 0 : INF;
dp[curr][1][1] = black[curr] == 1 ? INF : 1;
for(int e = head[curr]; e != -1; e = next[e]) {
int node = to[e];
if(!visited[node]) {
visited[node] = true;
dp(node, visited, dp);
int[][] temp = new int[2][2];
temp[0][0] = Math.min(dp[curr][0][0] + dp[node][0][0], dp[curr][1][0] + dp[node][0][1]);
temp[0][1] = Math.min(dp[curr][0][1] + dp[node][1][0], dp[curr][1][1] + dp[node][1][1]);
temp[1][0] = Math.min(dp[curr][1][0] + dp[node][0][0], dp[curr][0][0] + dp[node][0][1]);
temp[1][1] = Math.min(dp[curr][1][1] + dp[node][1][0], dp[curr][0][1] + dp[node][1][1]);
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 2; j++) {
dp[curr][i][j] = temp[i][j];
}
}
}
}
}
private static void addEdge(int e, int u, int v) {
next[e] = head[u];
head[u] = e;
to[e] = v;
}
static class FastScanner {
InputStream is = System.in;
byte[] buffer = new byte[1 << 17];
int pointer = 0;
int bufferLength = 0;
private byte readByte() {
if (pointer == bufferLength) {
try {
bufferLength = is.read(buffer);
pointer = 0;
if (bufferLength == -1)
bufferLength = 0;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return bufferLength == 0 ? -1 : buffer[pointer++];
}
private void skip() {
int b;
while ((b = readByte()) != -1 && b <= 32)
;
if (b != -1)
pointer--;
}
public int nextInt() {
int n = 0;
skip();
int b = readByte();
while (b >= '0' && b <= '9') {
n = n * 10 + (b - '0');
b = readByte();
}
return n;
}
}
}
