#include<bits/stdc++.h>
using namespace std;
int k = 300;
signed main(){
cin.tie(0);
iostream::sync_with_stdio(false);
int n, m, q;
cin >> n >> m >> q;
vector<vector<int>> g(n), tg(n);
for (int i=0; i<m; i++){
int s, e;
cin >> s >> e;
s--; e--;
g[s].push_back(e);
tg[e].push_back(s);
}
vector<vector<pair<int,int>>> dp(n);
vector<int> idx(n), flag(n, -1);
for (int i=0; i<n; i++){
dp[i].push_back({0, i});
idx[i] = 0;
flag[i] = i;
for (int next : tg[i]){
for (auto [len, s] : dp[next]){
if (flag[s] < i){
dp[i].push_back({len-1, s});
idx[s] = dp[i].size()-1;
flag[s] = i;
}
else dp[i][idx[s]].first = min(dp[i][idx[s]].first, len-1);
}
}
sort(dp[i].begin(), dp[i].end());
while (dp[i].size() > k) dp[i].pop_back();
}
for (int i=0; i<q; i++){
int t, y;
cin >> t >> y;
t--;
unordered_set<int> busy;
for (int j=0; j<y; j++){
int x;
cin >> x;
busy.insert(x-1);
}
if (y < k){
for (int j=0; j<dp[t].size(); j++){
if (busy.find(dp[t][j].second) == busy.end()){
cout << -dp[t][j].first << '\n';
break;
}
if (j == dp[t].size()-1){
cout << -1 << '\n';
break;
}
}
}
else {
int bsf = -1;
vector<int> dp2(n, -pow(10, 9));
for (int cur=n-1; cur>=0; cur--){
if (cur == t) dp2[cur] = 0;
if (busy.find(cur) == busy.end()) bsf = max(bsf, dp2[cur]);
//cout << cur << " " << dp2[cur] << endl;
for (int next : tg[cur]) dp2[next] = max(dp2[next], dp2[cur]+1);
}
cout << bsf << '\n';
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |