# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
109201 | njchung99 | 전압 (JOI14_voltage) | C++14 | 227 ms | 17528 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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);
}
컴파일 시 표준 에러 (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... |