Go to diff to previous submission
#include <cstdio> #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]; 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]] >= 2) { printf("YES\n"); return; } } printf("NO\n"); } int main() { while (true) { if (scanf("%d%d", &V, &E) != 2) break; GO(); } return 0; }
--- c5.s552.cteam032.fn.cpp.0.fn.cpp +++ c5.s660.cteam032.fn.cpp.0.fn.cpp @@ -22,14 +22,40 @@ 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]; void GO() { - for (int i=0;i<MAXN;i++) { - ADJ_N[i]=0; + + 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++) { - int a, b; - scanf("%d%d", &a, &b); - ADJ_N[a]++; - ADJ_N[b]++; + 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]; } @@ -38,8 +64,48 @@ if (ADJ_N[qq] >= 4){ printf("YES\n"); - break; + return; } } - if (qq==V) printf("NO\n"); + + 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]] >= 2) { + printf("YES\n"); + return; + } + } + + printf("NO\n"); + }