제출 #583939

#제출 시각아이디문제언어결과실행 시간메모리
583939PiejanVDC장난감 기차 (IOI17_train)C++17
0 / 100
9 ms1516 KiB
#include <bits/stdc++.h>
#include "train.h"

using namespace std;

const int mxN = (int)5005;

vector<int>adj[mxN];
vector<int>radj[mxN];

vector<int>df;
vector<int>c(mxN);

int C = 0;

vector<bool>vis(mxN);
vector<bool>rvis(mxN);

void dfs(int u) {
    vis[u] = 1;
    for(auto z : adj[u]) if(!vis[z]) {
        dfs(z);
    }
    df.push_back(u);
}

void col(int u) {
    c[u] = C;
    rvis[u] = 1;
    for(auto z : radj[u]) if(!rvis[z]) {
        col(z);
    }
}

vector<int>who_wins(vector<int>a, vector<int>r, vector<int>u, vector<int>v) {

    int n = r.size();
    int m = u.size();

    for(int i = 0 ; i < m ; i++) {
        adj[u[i]].push_back(v[i]);
        radj[v[i]].push_back(u[i]);
    }

    dfs(0);

    for(auto z : df) {
        if(c[z]) continue;

        C++;
        col(z);
    }

    vector<bool>have(n,0);

    for(int i = 1 ; i <= C ; i++) {
        for(int node = 0 ; node < n ; node++) {
            if(c[node] == i && r[node])
                have[i] = 1;
        }
    }

    vector<int>ans(n,0);

    for(int i = 0 ; i < n ; i++) {
        vector<bool>t(n,0);
        t[i] = 1;
        stack<int>s;
        s.push(i);
        while(!s.empty()) {
            int node = s.top();
            s.pop();
            if(have[c[node]]) {
                ans[i] = 1;
                break;
            }
            for(auto z : adj[node]) if(!t[z]) {
                t[z] = 1;
                s.push(z);
            }
        }
    }

    return ans;
}
#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...