# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
109201 | njchung99 | 전압 (JOI14_voltage) | C++14 | 227 ms | 17528 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<stack>
using namespace std;
int n, m;
stack<int> st;
pair<int, int> a[200010];
vector<vector<int>> vt;
int par[100010];
int de[100010];
int visited[100010];
int used[200010];
int dp[100010];
int dp1[100010];
int dap = 0;
int odd = 0;
void dfs(int here) {
st.push(here);
visited[here] = 1;
for (int i = 0; i < vt[here].size(); i++) {
int id = vt[here][i];
int next = a[id].first^a[id].second^here;
if (!visited[next]) {
used[id] = 1;
par[next] = here;
de[next] = de[here] + 1;
dfs(next);
}
}
}
int main()
{
scanf("%d %d", &n, &m);
vt.resize(n + 1);
for (int i = 0; i < m; i++) {
int q, w;
scanf("%d %d", &q, &w);
vt[q].push_back(i);
vt[w].push_back(i);
a[i] = { q,w };
}
for (int i = 1; i <= n; i++) {
if(!visited[i])
dfs(i);
}
for (int i = 0; i < m; i++) {
if (used[i])continue;
int x = a[i].first;
int y = a[i].second;
if (de[x] < de[y])
swap(x, y);
if (de[x] % 2 == de[y] % 2) {
dp[x]++; dp[y]--;
odd++;
}
else {
dp1[x]++; dp1[y]--;
}
}
if (odd == 1)dap++;
while (st.size()) {
int t = st.top();
int p = par[t];
st.pop();
if (par[t] && dp[t]==odd && dp1[t] == 0)dap++;
dp[p] += dp[t];
dp1[p] += dp1[t];
}
printf("%d\n", dap);
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |