#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
const int inf = 1e9 + 7;
vector<int> radj[MAXN];
vector<pair<int, int>> best[MAXN];
bool vis[MAXN], busy[MAXN];
int dist[MAXN];
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int nodes, edges, queries; cin >> nodes >> edges >> queries;
int sz = sqrt(nodes);
for (int i = 0; i < edges; i++){
int a, b; cin >> a >> b;
radj[b].push_back(a);
}
for (int i = 1; i <= nodes; i++){
vector<int> visv;
dist[i] = 0; vis[i] = 1; visv.push_back(i);
for (int prv : radj[i])
for (auto p : best[prv]){
int d = p.first + 1, x = p.second;
if (vis[x]){
if (d > dist[x]) dist[x] = d;
}
else {
dist[x] = d;
vis[x] = 1;
visv.push_back(x);
}
}
for (int x : visv) {
best[i].push_back({dist[x], x});
vis[x] = 0;
}
sort(best[i].begin(), best[i].end(), greater<pair<int, int>>());
while (best[i].size() > sz) best[i].pop_back();
}
for (int q = 0; q < queries; q++){
int x, bnum; cin >> x >> bnum;
vector<int> bv(bnum);
for (int i = 0; i < bnum; i++) {
cin >> bv[i];
busy[bv[i]] = 1;
}
if (bnum < sz){
int ans = -1;
for (auto p : best[x])
if (!busy[p.second]){
ans = p.first;
break;
}
cout << ans << '\n';
}
else{
vector<int> memo(x + 1, -1);
for (int i = 1; i <= x; i++){
if (!busy[i]) memo[i] = 0;
for (int prv : radj[i])
if (memo[prv] != -1)
memo[i] = max(memo[i], memo[prv] + 1);
}
cout << memo[x] << '\n';
}
for (int i = 0; i < bnum; i++) busy[bv[i]] = 0;
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |