Go to diff to previous submission
#include <cstdio> #include <iostream> #include <cstdlib> #include <cmath> #include <algorithm> #include <utility> #include <string> #include <deque> #include <list> #include <map> #include <queue> #include <set> #include <stack> #include <vector> using namespace std; #define debug printf //#define debug blackhole void blackhole(...) {} #define MAXN 20000 int ADJ_N[MAXN]; int V; int E; int Vp[MAXN]; int Ep[MAXN]; int fir[MAXN]; int sec[MAXN]; int comp[MAXN]; int compcnt; int Q[2*MAXN]; int Qsize; int GoodInComp[MAXN]; int used[MAXN]; bool walk(int component) { for (int i = 0; i < V; i++) { if (comp[i] != component || ADJ_N[i] < 3) continue; for (int j = 0; j < V; j++) used[j] = 0; Qsize = 0; int leavecnt = 0; Q[Qsize++] = i; used[i] = 1; for (int q = 0; q < Qsize; q++) { int isleave = 1; for (int v = Vp[Q[q]]; v < Vp[Q[q]+1]; v++) { if (used[Ep[v]] == 0) { isleave = 0; used[Ep[v]] = 1; Q[Qsize++] = Ep[v]; } } if (isleave == 1) { leavecnt++; } } if (leavecnt >= 4) return true; } return false; } void GO() { for (int i = 0; i < MAXN; i++) { Vp[i] = 0; Ep[i] = 0; fir[i] = sec[i] = 0; Qsize = 0; Q[i] = 0; GoodInComp[i] = 0; comp[i] = 0; compcnt = 0; ADJ_N[i] = 0; } for (int i = 0; i < E; i++) { scanf("%d%d", fir+i, sec+i); Vp[--fir[i]]++; Vp[--sec[i]]++; ADJ_N[fir[i]]++; ADJ_N[sec[i]]++; } for (int i = 0; i < V; i++) Vp[i+1] += Vp[i]; for (int i = 0; i < E; i++) { Ep[--Vp[fir[i]]] = sec[i]; Ep[--Vp[sec[i]]] = fir[i]; } int qq; for (qq=0;qq<V;qq++) { if (ADJ_N[qq] >= 4){ printf("YES\n"); return; } } int max = 0; for (int i = 0; i < V; i++) { if (ADJ_N[i] > max) max = ADJ_N[i]; } if (max <= 2) { printf("NO\n"); return; } for (int i = 0; i < V; i++) { if (comp[i] > 0) continue; comp[i] = ++compcnt; Qsize = 0; Q[Qsize++] = i; for (int q = 0; q < Qsize; q++) { for (int v = Vp[Q[q]]; v < Vp[Q[q]+1]; v++) { if (comp[Ep[v]] == 0) { comp[Ep[v]] = compcnt; Q[Qsize++] = Ep[v]; } } } } for (int i = 0; i < V; i++) { if (ADJ_N[i] >= 3) { GoodInComp[comp[i]]++; } } for (int i = 1; i <= compcnt; i++) { if (GoodInComp[comp[i]] > 5) { printf("YES\n"); return; } if (GoodInComp[comp[i]] >= 2) { if (walk(i)) { printf("YES\n"); return; } } } printf("NO\n"); } int main() { while (true) { if (scanf("%d%d", &V, &E) != 2) break; GO(); } return 0; }
--- c5.s660.cteam032.fn.cpp.0.fn.cpp +++ c5.s989.cteam032.fn.cpp.0.fn.cpp @@ -1,3 +1,4 @@ #include <cstdio> +#include <iostream> #include <cstdlib> #include <cmath> @@ -31,4 +32,36 @@ int Qsize; int GoodInComp[MAXN]; +int used[MAXN]; + +bool walk(int component) { + for (int i = 0; i < V; i++) { + if (comp[i] != component || ADJ_N[i] < 3) + continue; + for (int j = 0; j < V; j++) + used[j] = 0; + Qsize = 0; + int leavecnt = 0; + Q[Qsize++] = i; + used[i] = 1; + for (int q = 0; q < Qsize; q++) { + int isleave = 1; + for (int v = Vp[Q[q]]; v < Vp[Q[q]+1]; v++) { + if (used[Ep[v]] == 0) { + isleave = 0; + used[Ep[v]] = 1; + Q[Qsize++] = Ep[v]; + } + + } + if (isleave == 1) { + leavecnt++; + } + } + if (leavecnt >= 4) + return true; + } + return false; +} + void GO() { @@ -100,8 +134,14 @@ } for (int i = 1; i <= compcnt; i++) { - if (GoodInComp[comp[i]] >= 2) { + if (GoodInComp[comp[i]] > 5) { printf("YES\n"); return; } + if (GoodInComp[comp[i]] >= 2) { + if (walk(i)) { + printf("YES\n"); + return; + } + } }