From bf6e6b0c862c1dadf6460fc7a2036fdf9f7d9e9c Mon Sep 17 00:00:00 2001 From: unlockable Date: Mon, 13 Nov 2023 01:15:06 +0800 Subject: [PATCH] MLE and WA --- 2023205/main.cpp | 57 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 11 deletions(-) diff --git a/2023205/main.cpp b/2023205/main.cpp index 38446d1..4c21b26 100644 --- a/2023205/main.cpp +++ b/2023205/main.cpp @@ -1,20 +1,53 @@ #include -int nodes[65540] = {0}; +// 并查集。并查集只关注双向连通性。 + +struct Edge { + unsigned short end; + int next; +}; + +Edge edges[1050000]; +char nodes_visited[65540]; +int head[65540], len; + +int add_edge(int start, int terminal) { + edges[++len].end = terminal; + edges[len].next = head[start]; + head[start] = len; + return 0; +} + +int dfs(int start) { + if (nodes_visited[start] >= 1) { + nodes_visited[start] = 2; + return 0; + } + nodes_visited[start] = 1; + for (int j = head[start]; j != 0; j = edges[j].next) { + dfs(edges[j].end); + } + return 0; +} int main() { int N, M; scanf("%d %d", &N, &M); - for (int i = 0; i < N; i++) { - int total_edge, dest_node; - scanf("%d", &total_edge); - for (int j = 0; j < total_edge; j++) { - scanf("%d", &dest_node); - nodes[dest_node]++; + for (int start = 0; start < N; start++) { + int edge_count; + scanf("%d", &edge_count); + for (int j = 0; j < edge_count; j++) { + int terminal; + scanf("%d", &terminal); + add_edge(start, terminal); } } - for (int i = 1; i < N; i++) { - if (nodes[i] == 0) { - for (int i = 0; i <= M; i++) { + + dfs(0); + + for (int i = 0; i < N; i++) { + if (nodes_visited[i] < 1) { + // Not connected! + for (int j = 0; j <= M; j++) { printf("0\n"); } return 0; @@ -22,15 +55,17 @@ int main() { } printf("1\n"); + for (int i = 0; i < M; i++) { int start, end; scanf("%d %d", &start, &end); - if (end == 0 || nodes[end] > 1) { + if (nodes_visited[end] == 2) { printf("1\n"); } else { printf("0\n"); } } + return 0; } \ No newline at end of file