제출 #95878

#제출 시각아이디문제언어결과실행 시간메모리
95878KastandaPipes (CEOI15_pipes)C++11
100 / 100
4308 ms4080 KiB
#include<bits/stdc++.h> using namespace std; const int N = 100005, M = 130005; int n, cnt, tk, H[N], Mn[N], stk[N], par[N]; int ts, head[N], nxt[M + M]; int m, from[M], to[M]; bitset < M > tree, bridge; bitset < N > mark; inline void Unlaze() { mark = 0; tree = 0; memset(H, 0, sizeof(H)); for (int i = 1; i <= n; i++) if (!mark[i]) { tk = 1; stk[tk] = i; par[tk] = -1; /* DFS */ int v, u; while (tk) { v = stk[tk]; if (mark[v]) { u = from[head[v] >> 1] ^ to[head[v] >> 1] ^ v; Mn[v] = min(Mn[v], Mn[u]); if (Mn[u] < H[u]) bridge[head[v] >> 1] = 0; head[v] = nxt[head[v]]; } if (!mark[v]) { mark[v] = 1; Mn[v] = H[v]; } for (; head[v] != -1; head[v] = nxt[head[v]]) if ((head[v] >> 1) != par[tk]) { u = from[head[v] >> 1] ^ to[head[v] >> 1] ^ v; if (mark[u]) Mn[v] = min(Mn[v], H[u]), bridge[head[v] >> 1] = 0; else { H[u] = H[v] + 1; tree[head[v] >> 1] = 1; ++ tk; stk[tk] = u; par[tk] = head[v] >> 1; break; } } if (head[v] == -1) tk --; } /* DFS */ } cnt = 0; for (int i = 0; i < (ts >> 1); i++) if (tree[i]) { bool _bool; _bool = tree[i]; tree[i] = tree[cnt]; tree[cnt] = _bool; _bool = bridge[i]; bridge[i] = bridge[cnt]; bridge[cnt] = _bool; swap(from[i], from[cnt]); /*from[i] ^= from[cnt]; from[cnt] ^= from[i]; from[i] ^= from[cnt];*/ swap(to[i], to[cnt]); /*to[i] ^= to[cnt]; to[cnt] ^= to[i]; to[i] ^= to[cnt];*/ cnt ++; } ts = 0; memset(nxt, -1, sizeof(nxt)); memset(head, -1, sizeof(head)); for (int i = 0; i < cnt; i++) { int v, u; v = from[i]; u = to[i]; from[ts >> 1] = v; to[ts >> 1] = u; nxt[ts] = head[v]; head[v] = ts; nxt[ts|1] = head[u]; head[u] = ts|1; ts += 2; } } int main() { memset(nxt, -1, sizeof(nxt)); memset(head, -1, sizeof(head)); scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) { int v, u; scanf("%d%d", &v, &u); bridge[ts >> 1] = 1; from[ts >> 1] = v; to[ts >> 1] = u; nxt[ts] = head[v]; head[v] = ts; nxt[ts|1] = head[u]; head[u] = ts|1; ts += 2; if (ts >= M + M - 20) Unlaze(); } Unlaze(); for (int i = 0; i < (ts >> 1); i++) if (bridge[i]) printf("%d %d\n", from[i], to[i]); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

pipes.cpp: In function 'int main()':
pipes.cpp:102:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d", &n, &m);
     ~~~~~^~~~~~~~~~~~~~~~
pipes.cpp:106:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &v, &u);
         ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...