#include <bits/stdc++.h>
#define pb push_back
#define f first
#define s second
using namespace std;
const int Nn = 1e6 + 6;
bool cycle, new_cycle = false, REKT, f[Nn], us[Nn], in_cycle[Nn];
int n, ans, CM = -1, degreemax, len, comp, p[Nn], sz[Nn], pr[Nn];
set < pair < int , int > > st;
vector < int > v[Nn];
int P(int x) {
if (p[x] == x) return x;
return p[x] = P(p[x]);
}
void Init(int N_) {
n = ans = N_;
degreemax = 0;
for (int i = 0; i < n; ++i) {
st.insert({v[i].size(), i});
p[i] = i;
}
}
void dfs(int x, int p, int fn) {
pr[x] = p;
if (x == fn) {
len = 1;
cycle = true;
in_cycle[x] = true;
while (x != pr[x]) {
++len;
x = pr[x];
in_cycle[x] = true;
}
return ;
}
for (int i = 0; i < v[x].size(); ++i) {
int to = v[x][i];
if (to != p) dfs(to, x, fn);
if (cycle) return ;
}
}
bool okr;
void wfs(int x, int p, int fn) {
pr[x] = p;
if (CM == -1 && in_cycle[x]) CM = x;
else
if (CM != x && in_cycle[x]) REKT = true;
else
if (CM == x && in_cycle[x]) okr = true;
if (x == fn) {
new_cycle = true;
in_cycle[x] = true;
while (x != pr[x]) {
x = pr[x];
in_cycle[x] = true;
}
return ;
}
for (int i = 0; i < v[x].size(); ++i) {
int to = v[x][i];
if (to != p) wfs(to, x, fn);
if (new_cycle || REKT) return ;
}
}
void Link(int A, int B) {
int ap = P(A), bp = P(B);
if (ap != bp) {
if (sz[ap] < sz[bp]) swap(ap, bp);
sz[ap] += sz[bp];
p[bp] = ap;
}
else {
if (!cycle) {
//comp = A;
dfs(A, A, B);
assert(cycle == true);
}
else
if (cycle) {
if (!REKT) {
new_cycle = false;
if (CM == -1) {
wfs(A, A, B);
if (CM == -1) {
REKT = true;
}
}
else {
okr = false;
wfs(A, A, B);
if (!okr) REKT = true;
}
}
}
}
st.erase(st.find({v[A].size(), A}));
st.erase(st.find({v[B].size(), B}));
v[A].pb(B), v[B].pb(A);
st.insert({v[A].size(), A});
st.insert({v[B].size(), B});
if (v[A].size() > v[degreemax].size()) degreemax = A;
if (v[B].size() > v[degreemax].size()) degreemax = B;
}
bool check(int x) {
if (cycle && (CM == -1 && !in_cycle[x])) return 0;
st.erase(st.find({v[x].size(), x}));
for (int i = 0; i < v[x].size(); ++i) {
int to = v[x][i];
st.erase(st.find({v[to].size(), to}));
st.insert({v[to].size() - 1, to});
}
bool ok = true;
if (st.size() && (*st.rbegin()).f > 2) ok = false;
for (int i = 0; i < v[x].size(); ++i) {
int to = v[x][i];
st.erase(st.find({v[to].size() - 1, to}));
st.insert({v[to].size(), to});
}
st.insert({v[x].size(), x});
return ok;
}
int CountCritical() {
if (REKT) return 0;
degreemax += 1/0;
if (v[degreemax].size() <= 2) {
if (!cycle) return n;
return len;
}
int res = 0;
for (int i = 0; i < n; ++i) {
res += check(i);
}
return res;
/*
if (v[degreemax].size() > 3) {
if (cycle && !in_cycle[degreemax]) return 0;
st.erase(st.find({v[degreemax].size(), degreemax}));
if ((*st.rbegin()).f > 3) return 0;
st.insert({v[degreemax].size(), degreemax});
for (int i = 0; i < v[degreemax].size(); ++i) {
us[v[degreemax][i]] = true;
}
bool ok = true;
for (int i = 0; i < n; ++i) {
if (i != degreemax && !us[i] && v[i].size() > 2) {
ok = false;
break;
}
}
for (int i = 0; i < v[degreemax].size(); ++i) {
us[v[degreemax][i]] = false;
}
return ok;
}
if (v[degreemax].size() == 3) {
int res = 0;
res += check(degreemax);
res += check(v[degreemax][0]);
res += check(v[degreemax][1]);
res += check(v[degreemax][2]);
return res;
}*/
}
Compilation message
rings.cpp: In function 'void dfs(int, int, int)':
rings.cpp:43:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
43 | for (int i = 0; i < v[x].size(); ++i) {
| ~~^~~~~~~~~~~~~
rings.cpp: In function 'void wfs(int, int, int)':
rings.cpp:69:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
69 | for (int i = 0; i < v[x].size(); ++i) {
| ~~^~~~~~~~~~~~~
rings.cpp: In function 'bool check(int)':
rings.cpp:120:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
120 | for (int i = 0; i < v[x].size(); ++i) {
| ~~^~~~~~~~~~~~~
rings.cpp:128:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
128 | for (int i = 0; i < v[x].size(); ++i) {
| ~~^~~~~~~~~~~~~
rings.cpp: In function 'int CountCritical()':
rings.cpp:139:16: warning: division by zero [-Wdiv-by-zero]
139 | degreemax += 1/0;
| ~^~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
40 ms |
48096 KB |
Execution killed with signal 4 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
1802 ms |
138960 KB |
Execution killed with signal 4 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
40 ms |
48096 KB |
Execution killed with signal 4 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
40 ms |
48096 KB |
Execution killed with signal 4 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
40 ms |
48096 KB |
Execution killed with signal 4 |
2 |
Halted |
0 ms |
0 KB |
- |