답안 #95885

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
95885 2019-02-03T10:17:21 Z Kastanda Pipes (CEOI15_pipes) C++11
100 / 100
2910 ms 8300 KB
#include<bits/stdc++.h>
using namespace std;
const int N = 100005, M = 400005;
int n, cnt, tk, H[N], Mn[N], stk[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;

            /* 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 (!tree[head[v] >> 1])
                    {
                        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;
                            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;
}

Compilation message

pipes.cpp: In function 'int main()':
pipes.cpp:100: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:104:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &v, &u);
         ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 4352 KB Output is correct
2 Correct 5 ms 4352 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 4480 KB Output is correct
2 Correct 7 ms 4352 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 171 ms 7500 KB Output is correct
2 Correct 198 ms 7528 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 377 ms 7504 KB Output is correct
2 Correct 409 ms 7544 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 587 ms 7628 KB Output is correct
2 Correct 371 ms 7672 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 686 ms 8008 KB Output is correct
2 Correct 715 ms 7828 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1152 ms 8092 KB Output is correct
2 Correct 1077 ms 7972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1639 ms 8300 KB Output is correct
2 Correct 1705 ms 7952 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2684 ms 8132 KB Output is correct
2 Correct 2355 ms 7944 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2910 ms 8056 KB Output is correct
2 Correct 2663 ms 8076 KB Output is correct