ABC315E 题解
啊这是一篇水文
题意就是,有 N 本书,每本书 i 需要在阅读前先阅读一些依赖的书;要求以最少阅读量完成书 1 的阅读,按照满足依赖关系的阅读顺序打印出必须阅读的除书 1 以外的书的编号。
就是个拓扑排序板子,但是为了满足最小阅读量,所以跑一遍深搜把不会访问到的点排除出点集就行。
Code:
void dfs(int u)
{
vis[u] = 1;
for (auto v : G[u]) {
if (!vis[v])
dfs(v);
}
}
int main()
{
io_init();
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> cnt;
deg[i] = cnt;
G[i].reserve(cnt);
for (int j = 1; j <= cnt; j++) {
cin >> v;
G[i].push_back(v);
rg[v].push_back(i);
}
}
dfs(1);
for (int i = 1; i <= n; i++) {
if (!vis[i]) deg[i] = -1;
}
for (int i = 1; i <= n; i++) {
if (deg[i] == 0)
q.push(i);
}
while (!q.empty()) {
int u = q.front(); q.pop();
rd.push_back(u);
for (int v : rg[u]) {
if (--deg[v] == 0)
q.push(v);
}
}
for (int x : rd) if (x != 1) cout << x << ' ';
return 0;
}