Codeforces Round #743 (Div. 2) Book
Posted thusloop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #743 (Div. 2) Book相关的知识,希望对你有一定的参考价值。
Book
题意 :读完第i本书要先读完 k1,k2……的书,从上往下读书,问读完所有书要多少次。
思路: 先想一个特殊情况,读1的前置条件是2,读2的前置条件是1,那么相当于形成了一个环,就永远不可能读完,因此可以想到图来解决,进一步模拟样例发现,设要读完 i 需要读完 k1,k2,k3,那么可以建立 k1->i ,k2->i,k3->i 的图,之后用类似拓扑排序来遍历图 ,拓扑排序后如果有环则输出-1,如果后续节点比当前大,则可以在同一遍内读完,否则就要比当前节点多一遍来读
#include<bits/stdc++.h>
//#define int long long
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
//const int inf=2e18+100;
const int maxn=2e5+100;
vector<int>g[maxn];
int d[maxn],in[maxn];//d[i]为读完i所需的遍数
queue<int>q;
signed main()
{
IOS
int tt;
cin>>tt;
while(tt--)
{
while(!q.empty())q.pop();
int n;
cin>>n;
int sum=n;
for(int i=1;i<=n;i++)g[i].clear();
memset(d,0,sizeof(int)*(n+10));
memset(in,0,sizeof(int)*(n+10));
for(int i=1;i<=n;i++)
{
int k;
cin>>k;
if(k==0)
{
d[i]=1;
q.push(i);
sum--;
}
for(int j=1;j<=k;j++)
{
int x;
cin>>x;
g[x].push_back(i);
in[i]++;
}
}
while(!q.empty())
{
int x=q.front();
q.pop();
for(auto it:g[x])
{
in[it]--;
if(in[it]==0)
{
q.push(it);
sum--;
}
if(it>x)
{
d[it]=max(d[it],d[x]);
}
else
{
d[it]=max(d[it],d[x]+1);
}
}
}
if(sum!=0)cout<<"-1"<<"\\n";
else
{
int ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,d[i]);
}
cout<<ans<<"\\n";
}
}
}
以上是关于Codeforces Round #743 (Div. 2) Book的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #743 (Div. 2) B. Swaps
Codeforces Round #743 (Div. 2) Book
Codeforces Round #436 E. Fire(背包dp+输出路径)