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 |
|
|
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 |