Go to diff to previous submission
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<cctype> #include<climits> #include<algorithm> #include<utility> #include<string> #include<deque> #include<list> #include<map> #include<queue> #include<set> #include<stack> #include<vector> using namespace std; #define REP(i,N) for (int i = 0; i < (N); i++) #define FOR(i,a,b) for (int i = (a); i <= (b); i++) #define FORI(i,a,b) for (int i = (a); i < (b); i++) #define FORD(i,a,b) for (int i = (a)-1; i >= (b); i--) #define DP(arg...) fprintf(stderr, ## arg) typedef long long ll; typedef long double ld; typedef pair<int,int> ii; int N,M; vector<int> E[11000]; int deg[11000]; int vis[11000]; int d3, d4; int psm, ps3; int sm[11000], s3[11000]; int cn; vector<int> vee; void dfs(int v) { //DP("%d ", v); cn++; if (deg[v] >= 3) d3++; if (deg[v] >= 4) d4++; if (deg[v] == 3) vee.push_back(v); vis[v] = 1; REP(i,E[v].size()) { if (deg[v] == 3 && sm[E[v][i]] == 0) { sm[E[v][i]] = 1; psm++; } if (deg[v] == 3 && deg[E[v][i]] == 3 && s3[E[v][i]] == 0) { s3[E[v][i]] = 1; ps3++; } if (!vis[E[v][i]]) dfs(E[v][i]); } } void solve() { REP(i,N) { deg[i] = 0; E[i].clear(); vis[i] = 0; sm[i] = 0; s3[i] = 0; } REP(i,M) { int a,b; scanf("%d%d", &a, &b); a--; b--; deg[a]++; deg[b]++; E[a].push_back(b); E[b].push_back(a); } REP(k,N) { d3 = 0, d4 = 0; psm = 0, ps3 = 0; cn = 0; vee.clear(); if (!vis[k]) dfs(k); else continue; //DP("%d\n", d3); if (d4 >= 1) { printf("YES\n"); return; } if (d3 >= 5) { printf("YES\n"); return; } if (d3 == 4 && cn > 4) { printf("YES\n"); return; } if (d3 == 3) { int tmp = 0; REP(t,3) { REP(ss,3) { if (deg[E[vee[t]][ss]] == 3) tmp++; } } if (tmp != 6) { printf("YES\n"); return; } } if (d3 == 2) { //DP("%d %d\n", ps3, psm); if (ps3 == 2) { if (psm >= 6) { printf("YES\n"); return; } } else { int spol = 0; int myv = vee[0]; REP(t,3) { int sous = E[myv][t]; int tmp = 0; REP(hr,E[sous].size()) { if (deg[E[sous][hr]] == 3) tmp++; } if (tmp == 2) spol++; } if (spol < 2) { printf("YES\n"); return; } } } } printf("NO\n"); } int main() { while (scanf("%d%d", &N, &M) != EOF) { solve(); } return 0; }
--- c5.s516.cteam022.fn.cpp.0.fn.cpp +++ c5.s677.cteam022.fn.cpp.0.fn.cpp @@ -35,12 +35,24 @@ int deg[11000]; int vis[11000]; -int d3, d4; - +int d3, d4; int psm, ps3; +int sm[11000], s3[11000]; +int cn; +vector<int> vee; void dfs(int v) { //DP("%d ", v); + cn++; if (deg[v] >= 3) d3++; if (deg[v] >= 4) d4++; + if (deg[v] == 3) vee.push_back(v); vis[v] = 1; REP(i,E[v].size()) { + if (deg[v] == 3 && sm[E[v][i]] == 0) { + sm[E[v][i]] = 1; + psm++; + } + if (deg[v] == 3 && deg[E[v][i]] == 3 && s3[E[v][i]] == 0) { + s3[E[v][i]] = 1; + ps3++; + } if (!vis[E[v][i]]) dfs(E[v][i]); @@ -49,5 +61,5 @@ void solve() { - REP(i,N) { deg[i] = 0; E[i].clear(); vis[i] = 0; } + REP(i,N) { deg[i] = 0; E[i].clear(); vis[i] = 0; sm[i] = 0; s3[i] = 0; } REP(i,M) { int a,b; scanf("%d%d", &a, &b); @@ -58,8 +70,50 @@ } + REP(k,N) { d3 = 0, d4 = 0; + psm = 0, ps3 = 0; + cn = 0; + + vee.clear(); if (!vis[k]) dfs(k); - if (d3 >= 2 || d4 >= 1) { printf("YES\n"); return; } + else continue; + //DP("%d\n", d3); + if (d4 >= 1) { printf("YES\n"); return; } + if (d3 >= 5) { printf("YES\n"); return; } + if (d3 == 4 && cn > 4) { printf("YES\n"); return; } + if (d3 == 3) { + int tmp = 0; + REP(t,3) { + REP(ss,3) { + if (deg[E[vee[t]][ss]] == 3) tmp++; + } + } + if (tmp != 6) + { printf("YES\n"); return; } + } + if (d3 == 2) { + //DP("%d %d\n", ps3, psm); + if (ps3 == 2) { + if (psm >= 6) + { printf("YES\n"); return; } + } + else { + int spol = 0; + int myv = vee[0]; + REP(t,3) { + int sous = E[myv][t]; + int tmp = 0; + REP(hr,E[sous].size()) { + if (deg[E[sous][hr]] == 3) tmp++; + } + if (tmp == 2) spol++; + } + if (spol < 2) { + printf("YES\n"); return; + } + } + + } } printf("NO\n");