abc315 解琐需要读的最少书
题面:有编号分别为1~n的书,读第i本书之前需要先读c[i]本书,编号分别为p[i][1], p[i][2], ...。现在想读编号为1的书,问需要提前读至少多少本书,给出任意一组可行的方案。
范围:2<=n<=2E5; sum(c[i])<=2E5
思路:类似拓扑排序,这里要输出方案,用dfs更方便。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a; i<=b; i++)
#define per(i,a,b) for(int i=b; i>=a; i--)
const int N = 200005;
int n, vis[N];
vector<int> adj[N];
int dfs(int x) {
vis[x] = -1;
for (auto i : adj[x]) if (vis[i] == 0) {
dfs(i);
}
vis[x] = 1;
if (x != 1) cout << x << " ";
return 0;
}
void solve() {
cin >> n;
rep(i,1,n) {
int c, p;
cin >> c;
rep(j,1,c) {
cin >> p;
adj[i].push_back(p);
}
}
dfs(1);
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
int t = 1;
while (t--) solve();
return 0;
}