답안 #749007

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
749007 2023-05-27T09:01:30 Z 반딧불(#9966) Povjerenstvo (COI22_povjerenstvo) C++17
13 / 100
2564 ms 118620 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(ans[y]) continue;
        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:51:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   51 |     scanf("%d %d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~~
Main.cpp:54:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   54 |         scanf("%d %d", &x, &y);
      |         ~~~~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 167 ms 66856 KB Output is correct
2 Correct 192 ms 68752 KB Output is correct
3 Correct 13 ms 23764 KB Output is correct
4 Correct 65 ms 34648 KB Output is correct
5 Correct 113 ms 53232 KB Output is correct
6 Correct 159 ms 58176 KB Output is correct
7 Correct 125 ms 54704 KB Output is correct
8 Correct 177 ms 56660 KB Output is correct
9 Correct 331 ms 61568 KB Output is correct
10 Correct 290 ms 58836 KB Output is correct
11 Correct 401 ms 59020 KB Output is correct
12 Correct 408 ms 54440 KB Output is correct
13 Correct 251 ms 56828 KB Output is correct
14 Correct 236 ms 55364 KB Output is correct
15 Correct 231 ms 55096 KB Output is correct
16 Correct 211 ms 55624 KB Output is correct
17 Correct 60 ms 28768 KB Output is correct
18 Correct 93 ms 34084 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 170 ms 67444 KB Output is correct
2 Correct 167 ms 55996 KB Output is correct
3 Correct 120 ms 52360 KB Output is correct
4 Correct 353 ms 56984 KB Output is correct
5 Correct 449 ms 60260 KB Output is correct
6 Correct 294 ms 63120 KB Output is correct
7 Correct 459 ms 62252 KB Output is correct
8 Runtime error 2564 ms 118620 KB Execution killed with signal 6
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 24276 KB Output is correct
2 Correct 14 ms 24148 KB Output is correct
3 Correct 14 ms 24020 KB Output is correct
4 Correct 15 ms 24148 KB Output is correct
5 Correct 15 ms 24228 KB Output is correct
6 Correct 15 ms 24192 KB Output is correct
7 Correct 16 ms 24148 KB Output is correct
8 Correct 57 ms 24172 KB Output is correct
9 Runtime error 35 ms 48328 KB Execution killed with signal 6
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 167 ms 66856 KB Output is correct
2 Correct 192 ms 68752 KB Output is correct
3 Correct 13 ms 23764 KB Output is correct
4 Correct 65 ms 34648 KB Output is correct
5 Correct 113 ms 53232 KB Output is correct
6 Correct 159 ms 58176 KB Output is correct
7 Correct 125 ms 54704 KB Output is correct
8 Correct 177 ms 56660 KB Output is correct
9 Correct 331 ms 61568 KB Output is correct
10 Correct 290 ms 58836 KB Output is correct
11 Correct 401 ms 59020 KB Output is correct
12 Correct 408 ms 54440 KB Output is correct
13 Correct 251 ms 56828 KB Output is correct
14 Correct 236 ms 55364 KB Output is correct
15 Correct 231 ms 55096 KB Output is correct
16 Correct 211 ms 55624 KB Output is correct
17 Correct 60 ms 28768 KB Output is correct
18 Correct 93 ms 34084 KB Output is correct
19 Correct 170 ms 67444 KB Output is correct
20 Correct 167 ms 55996 KB Output is correct
21 Correct 120 ms 52360 KB Output is correct
22 Correct 353 ms 56984 KB Output is correct
23 Correct 449 ms 60260 KB Output is correct
24 Correct 294 ms 63120 KB Output is correct
25 Correct 459 ms 62252 KB Output is correct
26 Runtime error 2564 ms 118620 KB Execution killed with signal 6
27 Halted 0 ms 0 KB -