Submission #1483906
Source Code Expand
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cfloat>
#include <cstring>
#include <map>
#include <utility>
#include <set>
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <list>
#include <algorithm>
#include <functional>
#include <sstream>
#include <complex>
#include <stack>
#include <queue>
#include <unordered_set>
#include <unordered_map>
#include <array>
#include <cassert>
#include <bitset>
using namespace std;
using LL = long long;
namespace scc_space
{
void dfs(int v_, vector<bool>&used_, vector<int>G_[], vector<int>&vs_)
{
used_[v_] = true;
for (int nxt : G_[v_])
{
if (!used_[nxt])dfs(nxt, used_, G_, vs_);
}
vs_.push_back(v_);
}
void rdfs(int v_, int k_, vector<bool>&used_, vector<vector<int>>&rG_, vector<int>&top)
{
used_[v_] = true;
top[v_] = k_;
for (int nxt : rG_[v_])
{
if (!used_[nxt])rdfs(nxt, k_, used_, rG_, top);
}
}
}
//頂点数n_のグラフG_の強連結成分分解をする
//topに強連結成分のトポロジカル順序が格納される
//(top[i]==top[j]のとき、iとjは強連結である。)
//戻り値:強連結成分の個数
int scc(vector<int>G_[], int n_, vector<int>&top)
{
using namespace scc_space;
top.resize(n_);
vector<vector<int>>rG_(n_);
for (int i = 0; i < n_; ++i)
{
for (int to : G_[i])
{
rG_[to].push_back(i);
}
}
vector<bool>used(n_, false);
vector<int>vs;
for (int v = 0; v < n_; ++v)
{
if (!used[v])dfs(v, used, G_, vs);
}
fill(used.begin(), used.end(), false);
int k = 0;
for (int i = vs.size() - 1; i >= 0; --i)
{
if (!used[vs[i]])rdfs(vs[i], k++, used, rG_, top);
}
return k;
}
int n, m, k;
char c[300];
vector<int>graph[300];
vector<int>top;
map<int, string>vert;//頂点の文字集合
vector<int>press[300];//強連結をつぶした後のDAG
vector<int>prinv[300];//pressの逆グラフ
set<int>prraw[300];
//強連結iにいて、文字列の長さがjの時の文字列
string memo[345][345];
bool izryt[345][345];
const string& dp(int i, int j)
{
if (izryt[i][j])return memo[i][j];
string res(j, '~');
if (prinv[i].empty())
{
res = vert[i];
res.resize(j, '~');
}
else
{
for (int las : prinv[i])
{
for (int k = 0; k <= j; ++k)
{
string S = dp(las, j - k) + vert[i];
if (S.size() < j)continue;
S.resize(j);
res = min(res, S);
}
}
}
memo[i][j] = res;
izryt[i][j] = true;
return memo[i][j];
}
int main(void)
{
cin >> n >> m >> k;
for (int i = 0; i < n; ++i)
cin >> c[i];
for (int i = 0; i < m; ++i)
{
int a, b;
cin >> a >> b;
--a; --b;
graph[a].push_back(b);
}
scc(graph, n, top);
for (int i = 0; i < n; ++i)
{
vert[top[i]].push_back(c[i]);
}
for (auto &p : vert)
{
sort(p.second.begin(), p.second.end());
}
for (int i = 0; i < n; ++i)
{
set<int>s;
for (int to : graph[i])
{
s.insert(top[to]);
}
for (int to : s)
{
if (to == top[i])continue;
prraw[top[i]].insert(to);
}
}
for (int i = 0; i < n; ++i)
{
for (auto p : prraw[i])
{
press[i].push_back(p);
prinv[p].push_back(i);
}
}
string ans(k, '~');
for (int i = 0; i < n; ++i)
{
string can = dp(i, k);
ans = min(ans, can);
}
if (ans.find('~') != string::npos)
{
cout << "-1\n";
}
else
{
cout << ans << endl;
}
return 0;
}
Submission Info
Submission Time |
|
Task |
C - 有向グラフ |
User |
platypus |
Language |
C++14 (GCC 5.4.1) |
Score |
100 |
Code Size |
3495 Byte |
Status |
AC |
Exec Time |
1235 ms |
Memory |
24448 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 |
2 ms |
1152 KB |
subtask0_sample_02.txt |
AC |
2 ms |
1280 KB |
subtask0_sample_03.txt |
AC |
2 ms |
1152 KB |
subtask0_sample_04.txt |
AC |
2 ms |
1152 KB |
subtask1_manual01.txt |
AC |
2 ms |
1152 KB |
subtask1_manual02.txt |
AC |
2 ms |
1280 KB |
subtask1_manual03.txt |
AC |
2 ms |
1280 KB |
subtask1_manual04.txt |
AC |
2 ms |
1152 KB |
subtask1_manual05.txt |
AC |
2 ms |
1152 KB |
subtask1_manual06.txt |
AC |
2 ms |
1152 KB |
subtask1_manual07.txt |
AC |
2 ms |
1280 KB |
subtask1_manual08.txt |
AC |
2 ms |
1280 KB |
subtask1_random01.txt |
AC |
20 ms |
1664 KB |
subtask1_random02.txt |
AC |
5 ms |
1408 KB |
subtask1_random03.txt |
AC |
47 ms |
2048 KB |
subtask1_random04.txt |
AC |
16 ms |
1664 KB |
subtask1_random05.txt |
AC |
3 ms |
1408 KB |
subtask1_special01.txt |
AC |
2 ms |
1408 KB |
subtask1_special02.txt |
AC |
4 ms |
1536 KB |
subtask1_special03.txt |
AC |
126 ms |
4736 KB |
subtask1_special04.txt |
AC |
523 ms |
12544 KB |
subtask1_special05.txt |
AC |
1235 ms |
24448 KB |
subtask1_special06.txt |
AC |
423 ms |
8960 KB |
subtask1_special07.txt |
AC |
98 ms |
3584 KB |
subtask1_special08.txt |
AC |
406 ms |
8960 KB |
subtask1_special09.txt |
AC |
402 ms |
8960 KB |
subtask1_special10.txt |
AC |
399 ms |
8832 KB |
subtask1_special11.txt |
AC |
287 ms |
7040 KB |
subtask1_special12.txt |
AC |
232 ms |
5760 KB |
subtask1_special13.txt |
AC |
188 ms |
4992 KB |
subtask1_special14.txt |
AC |
2 ms |
1408 KB |
subtask1_special15.txt |
AC |
1202 ms |
22528 KB |