Submission #3141806


Source Code Expand

#include"bits/stdc++.h"
using namespace std;
using ll = int64_t;

class StronglyConnectedComponents {
public:
    StronglyConnectedComponents(ll n) :
        n_(n),
        edges_(n),
        reverse_edges_(n),
        order_(n),
        num_(0) {}
    
    void addEdge(ll from, ll to) {
        edges_[from].push_back(to);
        reverse_edges_[to].push_back(from);
    }

    vector<vector<ll>> scc() {
        visit.assign(n_, false);
        for (ll i = 0; i < n_; i++) {
            dfsForward(i);
        }
        sort(order_.begin(), order_.end(), [](const Order& lhs, const Order& rhs) {
            return lhs.order > rhs.order;
        });
        visit.assign(n_, false);
        for (ll i = 0; i < n_; i++) {
            auto curr_result = dfsBackward(order_[i].index);
            if (curr_result.size() == 0) {
                continue;
            }
            result_.push_back(curr_result);
        }
        return result_;
    }

    vector<vector<ll>> sccEdges() {
        vector<vector<ll>> scc_edges(result_.size());
        vector<ll> indexToScc(n_);
        for (ll i = 0; i < (ll)result_.size(); i++) {
            for (ll j : result_[i]) {
                indexToScc[j] = i;
            }
        }

        for (ll i = 0; i < (ll)result_.size(); i++) {
            for (ll from : result_[i]) {
                for (ll to : edges_[from]) {
                    if (indexToScc[to] == i) {
                        continue;
                    }
                    scc_edges[i].push_back(indexToScc[to]);
                }
            }
        }
        return scc_edges;
    }
private:
    void dfsForward(ll curr) {
        if (visit[curr]) {
            return;
        }
        visit[curr] = true;
        for (ll next : edges_[curr]) {
            dfsForward(next);
        }
        order_[curr] = { curr, num_++ };
        return;
    }

    vector<ll> dfsBackward(ll curr) {
        vector<ll> curr_result;
        if (visit[curr]) {
            return curr_result;
        }
        visit[curr] = true;
        curr_result.push_back(curr);
        for (ll next : reverse_edges_[curr]) {
            auto members = dfsBackward(next);
            for (ll m : members) {
                curr_result.push_back(m);
            }
        }
        return curr_result;
    }

    ll n_;
    vector<vector<ll>> edges_;
    vector<vector<ll>> reverse_edges_;
    struct Order {
        ll index, order;
    };
    vector<Order> order_;
    vector<bool> visit;
    vector<vector<ll>> result_;
    ll num_;
};

int main() {
    ll n, m, k;
    cin >> n >> m >> k;
    vector<char> c(n);
    for (ll i = 0; i < n; i++) {
        cin >> c[i];
    }

    StronglyConnectedComponents scc(n);
    for (ll i = 0; i < m; i++) {
        ll a, b;
        cin >> a >> b;
        a--; b--;
        scc.addEdge(a, b);
    }

    auto scc_result = scc.scc();
    auto scc_edges = scc.sccEdges();

    ll N = scc_result.size();
    vector<string> scc_chars(N);
    for (ll i = 0; i < N; i++) {
        for (ll j : scc_result[i]) {
            scc_chars[i].push_back(c[j]);
        }
        //ソートしておく
        sort(scc_chars[i].begin(), scc_chars[i].end());
    }

    vector<vector<string>> dp(N + 1, vector<string>(k + 1));

    for (ll i = N - 1; i >= 0; i--) {
        for (ll j = 0; j <= min((ll)scc_result[i].size(), k); j++) {
            string str = scc_chars[i].substr(0, j);
            if (dp[i][j].empty() || dp[i][j] > str) {
                dp[i][j] = str;
            }
            for (ll next : scc_edges[i]) {
                for (ll l = 1; l <= k - j; l++) {
                    if (l > 0 && dp[next][l].empty()) {
                        break;
                    }
                    string tmp = str + dp[next][l];
                    if (dp[i][j + l].empty() || dp[i][j + l] > tmp) {
                        dp[i][j + l] = tmp;
                    }
                }
            }
        }
    }

    string ans;
    for (ll i = 0; i < N; i++) {
        if (dp[i][k].empty()) {
            continue;
        }
        if (ans.empty() || ans > dp[i][k]) {
            ans = dp[i][k];
        }
    }

    cout << (ans.empty() ? "-1" : ans) << endl;
}

Submission Info

Submission Time
Task C - 有向グラフ
User tokumini
Language C++14 (GCC 5.4.1)
Score 100
Code Size 4365 Byte
Status AC
Exec Time 13 ms
Memory 7296 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 4
AC × 32
Set Name Test Cases
Sample subtask0_sample_01.txt, subtask0_sample_02.txt, subtask0_sample_03.txt, subtask0_sample_04.txt
All subtask0_sample_01.txt, subtask0_sample_02.txt, subtask0_sample_03.txt, subtask0_sample_04.txt, subtask1_manual01.txt, subtask1_manual02.txt, subtask1_manual03.txt, subtask1_manual04.txt, subtask1_manual05.txt, subtask1_manual06.txt, subtask1_manual07.txt, subtask1_manual08.txt, subtask1_random01.txt, subtask1_random02.txt, subtask1_random03.txt, subtask1_random04.txt, subtask1_random05.txt, subtask1_special01.txt, subtask1_special02.txt, subtask1_special03.txt, subtask1_special04.txt, subtask1_special05.txt, subtask1_special06.txt, subtask1_special07.txt, subtask1_special08.txt, subtask1_special09.txt, subtask1_special10.txt, subtask1_special11.txt, subtask1_special12.txt, subtask1_special13.txt, subtask1_special14.txt, subtask1_special15.txt
Case Name Status Exec Time Memory
subtask0_sample_01.txt AC 1 ms 256 KB
subtask0_sample_02.txt AC 1 ms 256 KB
subtask0_sample_03.txt AC 1 ms 256 KB
subtask0_sample_04.txt AC 1 ms 256 KB
subtask1_manual01.txt AC 1 ms 256 KB
subtask1_manual02.txt AC 1 ms 256 KB
subtask1_manual03.txt AC 1 ms 256 KB
subtask1_manual04.txt AC 1 ms 256 KB
subtask1_manual05.txt AC 1 ms 256 KB
subtask1_manual06.txt AC 1 ms 256 KB
subtask1_manual07.txt AC 1 ms 256 KB
subtask1_manual08.txt AC 1 ms 256 KB
subtask1_random01.txt AC 4 ms 512 KB
subtask1_random02.txt AC 3 ms 384 KB
subtask1_random03.txt AC 6 ms 768 KB
subtask1_random04.txt AC 3 ms 512 KB
subtask1_random05.txt AC 2 ms 256 KB
subtask1_special01.txt AC 2 ms 384 KB
subtask1_special02.txt AC 2 ms 512 KB
subtask1_special03.txt AC 7 ms 2688 KB
subtask1_special04.txt AC 11 ms 5632 KB
subtask1_special05.txt AC 13 ms 7296 KB
subtask1_special06.txt AC 9 ms 2688 KB
subtask1_special07.txt AC 6 ms 1664 KB
subtask1_special08.txt AC 8 ms 2688 KB
subtask1_special09.txt AC 12 ms 2688 KB
subtask1_special10.txt AC 8 ms 2688 KB
subtask1_special11.txt AC 7 ms 2048 KB
subtask1_special12.txt AC 7 ms 1664 KB
subtask1_special13.txt AC 7 ms 1536 KB
subtask1_special14.txt AC 1 ms 384 KB
subtask1_special15.txt AC 13 ms 7296 KB