Submission #748994

# Submission time Handle Problem Language Result Execution time Memory
748994 2023-05-27T08:51:12 Z 반딧불(#9966) Povjerenstvo (COI22_povjerenstvo) C++17
13 / 100
440 ms 118988 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int n, m;
vector<int> link[500002], revLink[500002];
int ex[500002], ey[500002];

int ans[500002]; /// 0: ���� �� ��, 1: ��ĥ X, 2: ��ĥ O
vector<int> ansVec;
int deg[500002];

int bccCnt;
int depth[500002], bccNum[500002], bccDeg[500002], pushed[500002];
vector<int> vertices;

int checkBCC(int x){
    int ret = depth[x];
    vertices.push_back(x);
    for(auto y: link[x]){
        if(depth[y]) ret = min(ret, depth[y]);
        else depth[y] = depth[x] + 1, ret = min(ret, checkBCC(y));
    }
    if(ret >= depth[x]){
        int B = ++bccCnt;
        while(1){
            int tmp = vertices.back(); vertices.pop_back();
            bccNum[tmp] = B;
            if(tmp == x) break;
        }
    }
    return ret;
}

void colorBCC(int x, int c, int b){
    vector<int> sumLink = link[x];
    for(auto y: revLink[x]) sumLink.push_back(y);

    ans[x] = c;
//    printf("In ColorBCC: colored %d as %d\n", x, c);
    for(auto y: sumLink){
        if(bccNum[y] != b || ans[y]) continue;
        colorBCC(y, 3-c, b);
    }
}

int main(){
    scanf("%d %d", &n, &m);
    for(int i=1; i<=m; i++){
        int x, y;
        scanf("%d %d", &x, &y);
        ex[i] = x, ey[i] = y;
    }

    while(1){
        /// �ڵ� ������ �� ã��
        for(int i=1; i<=n; i++) deg[i] = 0;
        for(int i=1; i<=n; i++) link[i].clear(), revLink[i].clear();
        for(int i=1; i<=m; i++) if(!ans[ex[i]] && !ans[ey[i]]){
            link[ex[i]].push_back(ey[i]);
            revLink[ey[i]].push_back(ex[i]);
            deg[ex[i]]++;
        }

        queue<int> que;
        for(int i=1; i<=n; i++) if(!ans[i] && !deg[i]) pushed[i] = 1, que.push(i);
        while(!que.empty()){
            int x = que.front(); que.pop();
            int c = 2;
            for(int y: link[x]) if(ans[y] == 2) c = 1;
            for(int y: revLink[x]) if(ans[y] == 2) c = 1;
            ans[x] = c;
//            printf("In queue: colored %d as %d\n", x, c);
            if(ans[x] == 2){
                for(auto y: link[x]) if(!pushed[y]) pushed[y] = 1, que.push(y);
                for(auto y: revLink[x]) if(!pushed[y]) pushed[y] = 1, que.push(y);
            }
            for(auto y: revLink[x]){
                deg[y]--;
                if(!ans[y] && !deg[y] && !pushed[y]) pushed[y] = 1, que.push(y);
            }
        }

        /// ��ĥ�� �� �ƴ��� Ȯ��
        bool Done = 1;
        for(int i=1; i<=n; i++) if(!ans[i]) Done = 0;
        if(Done) break;

        bccCnt = 0;
        for(int i=1; i<=n; i++) bccNum[i] = depth[i] = bccDeg[i] = 0;
        vertices.clear();

        for(int i=1; i<=n; i++) if(!ans[i] && !bccNum[i]) depth[i] = 1, checkBCC(i);
        for(int i=1; i<=m; i++) if(!ans[ex[i]] && !ans[ey[i]] && bccNum[ex[i]] != bccNum[ey[i]]) bccDeg[bccNum[ex[i]]]++;

        int bccTarget = -1;
        for(int i=1; i<=bccCnt; i++) if(!bccDeg[i]) bccTarget = i;
        assert(bccTarget != -1);

        int start = -1;
        for(int i=1; i<=n; i++) if(!ans[i] && bccNum[i] == bccTarget) start = i;
        assert(start != -1);

        /// ��ĥ�� �ش�
        colorBCC(start, 1, bccTarget);

        /// �������� �̾��� ����� ��ĥ�� �ش�
        for(int i=1; i<=n; i++) if(bccNum[i] == bccTarget){
            if(ans[i] == 2) for(int j: revLink[i]) if(!ans[j]) ans[j] = 1;
        }
    }

    for(int i=1; i<=n; i++) if(ans[i] == 2) ansVec.push_back(i);
    printf("%d\n", (int)ansVec.size());
    for(auto x: ansVec) printf("%d ", x);
}

Compilation message

Main.cpp: In function 'int main()':
Main.cpp:50:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   50 |     scanf("%d %d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~~
Main.cpp:53:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   53 |         scanf("%d %d", &x, &y);
      |         ~~~~~^~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 179 ms 65676 KB Output is correct
2 Correct 187 ms 65404 KB Output is correct
3 Correct 12 ms 23764 KB Output is correct
4 Correct 66 ms 34612 KB Output is correct
5 Correct 112 ms 50904 KB Output is correct
6 Correct 166 ms 55980 KB Output is correct
7 Correct 137 ms 52844 KB Output is correct
8 Correct 173 ms 54872 KB Output is correct
9 Correct 338 ms 59752 KB Output is correct
10 Correct 363 ms 57688 KB Output is correct
11 Correct 382 ms 57572 KB Output is correct
12 Correct 398 ms 52792 KB Output is correct
13 Correct 264 ms 53548 KB Output is correct
14 Correct 250 ms 53604 KB Output is correct
15 Correct 230 ms 53712 KB Output is correct
16 Correct 214 ms 53924 KB Output is correct
17 Correct 64 ms 28620 KB Output is correct
18 Correct 100 ms 32976 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 182 ms 65600 KB Output is correct
2 Correct 157 ms 54700 KB Output is correct
3 Correct 121 ms 51520 KB Output is correct
4 Correct 353 ms 56500 KB Output is correct
5 Correct 440 ms 56896 KB Output is correct
6 Correct 298 ms 63680 KB Output is correct
7 Runtime error 263 ms 118988 KB Execution killed with signal 6
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 14 ms 24220 KB Output is correct
2 Correct 14 ms 24144 KB Output is correct
3 Correct 14 ms 24088 KB Output is correct
4 Correct 15 ms 24152 KB Output is correct
5 Correct 14 ms 24132 KB Output is correct
6 Correct 14 ms 24148 KB Output is correct
7 Runtime error 39 ms 48804 KB Execution killed with signal 6
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 179 ms 65676 KB Output is correct
2 Correct 187 ms 65404 KB Output is correct
3 Correct 12 ms 23764 KB Output is correct
4 Correct 66 ms 34612 KB Output is correct
5 Correct 112 ms 50904 KB Output is correct
6 Correct 166 ms 55980 KB Output is correct
7 Correct 137 ms 52844 KB Output is correct
8 Correct 173 ms 54872 KB Output is correct
9 Correct 338 ms 59752 KB Output is correct
10 Correct 363 ms 57688 KB Output is correct
11 Correct 382 ms 57572 KB Output is correct
12 Correct 398 ms 52792 KB Output is correct
13 Correct 264 ms 53548 KB Output is correct
14 Correct 250 ms 53604 KB Output is correct
15 Correct 230 ms 53712 KB Output is correct
16 Correct 214 ms 53924 KB Output is correct
17 Correct 64 ms 28620 KB Output is correct
18 Correct 100 ms 32976 KB Output is correct
19 Correct 182 ms 65600 KB Output is correct
20 Correct 157 ms 54700 KB Output is correct
21 Correct 121 ms 51520 KB Output is correct
22 Correct 353 ms 56500 KB Output is correct
23 Correct 440 ms 56896 KB Output is correct
24 Correct 298 ms 63680 KB Output is correct
25 Runtime error 263 ms 118988 KB Execution killed with signal 6
26 Halted 0 ms 0 KB -