제출 #43046

#제출 시각아이디문제언어결과실행 시간메모리
43046RayaBurong25_1Mousetrap (CEOI17_mousetrap)C++14
45 / 100
1490 ms64692 KiB
#include <stdio.h> #include <vector> std::vector<int> AdjList[1000005]; int PhaseII[1000005]; int m, t, T; int MT[1000005]; int between; void findMT(int u, int pa) { if (u == t) { MT[u] = t; return; } int i, v, s = AdjList[u].size(); for (i = 0; i < s; i++) { v = AdjList[u][i]; if (v != pa) { findMT(v, u); if (MT[v]) MT[u] = v; } } } void calcPhaseII(int u, int pa) { int i, v, s = AdjList[u].size(); int S = s; for (i = 0; i < s; i++) { v = AdjList[u][i]; if (v != pa && MT[v]) S--; } if (S == 1 || S == 2) PhaseII[u] = 1 - (pa == T); else if (pa == T) PhaseII[u] = S - 3; else PhaseII[u] = S - 2; PhaseII[u] += PhaseII[pa]; // printf("u%d PhaseII%d\n", u, PhaseII[u]); for (i = 0; i < s; i++) { v = AdjList[u][i]; if (v != pa && !MT[v]) calcPhaseII(v, u); } } int PhaseI[1000005]; int min(int a, int b) { return (a < b)?a:b; } void calcPhaseI(int u, int pa) { int i, v, s = AdjList[u].size(); int S = s; for (i = 0; i < s; i++) { v = AdjList[u][i]; if (v != pa && MT[v]) S--; } int p = PhaseII[u], q = PhaseII[u]; for (i = 0; i < s; i++) { v = AdjList[u][i]; if (v != pa && !MT[v]) { calcPhaseI(v, u); if (PhaseI[v] >= p) { q = p; p = PhaseI[v]; } else if (PhaseI[v] >= q) q = PhaseI[v]; } } if (S == 1) PhaseI[u] = q; else PhaseI[u] = 1 + q; // printf("u%d PhaseI%d\n", u, PhaseI[u]); } int main() { int n; scanf("%d %d %d", &n, &t, &m); int i, u, v; for (i = 0; i < n - 1; i++) { scanf("%d %d", &u, &v); AdjList[u].push_back(v); AdjList[v].push_back(u); } findMT(m, 0); for (i = 1; i <= n; i++) { // printf("MT %d\n", MT[i]); if (MT[i] && i != m && i != t) between += AdjList[i].size() - 2; } int ans = 0; u = m; while (u != t) { T = MT[u]; calcPhaseII(u, T); calcPhaseI(u, T); ans += PhaseI[u]; u = MT[u]; break; // printf("ans %d\n", ans); } // printf("ans %d between %d\n", ans, between); ans += between; printf("%d", ans); }

컴파일 시 표준 에러 (stderr) 메시지

mousetrap.cpp: In function 'int main()':
mousetrap.cpp:92:34: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d", &n, &t, &m);
                                  ^
mousetrap.cpp:96:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &u, &v);
                               ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...