VK Cup 2017 - Qualification 2 C. Online Courses In BSU(dfs)
发布日期:2021-05-08 15:17:21 浏览次数:22 分类:原创文章

本文共 807 字,大约阅读时间需要 2 分钟。


在这里插入图片描述
在这里插入图片描述
题意:总共有n个任务,有m个任务你必须完成,每个任务完成前可以有其他的子任务也必须完成,求完成的任务的顺序。
思路:一开始想着拓扑排序,但好像也不用那么反面,直接将那m个任务进行dfs,如果先后顺序反了则是-1.

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=2e5+1;int n,m,a[maxn],vis[maxn],pos[maxn];vector<int>g[maxn],ans;void dfs(int x){   	vis[x]=1;	for(auto to:g[x])	if(!vis[to]) dfs(to);	ans.push_back(x);}int main(){   	scanf("%d%d",&n,&m);	for(int i=1;i<=m;++i) scanf("%d",&a[i]);	for(int i=1,t,x;i<=n;++i)	{   		scanf("%d",&t);		while(t--)		{   			scanf("%d",&x);			g[i].push_back(x);		}	}	for(int i=1;i<=m;++i) if(!vis[a[i]]) dfs(a[i]);	for(int i=0;i<ans.size();++i) pos[ans[i]]=i;	for(int i=0;i<ans.size();++i)	{   		for(int j=0;j<g[ans[i]].size();++j)		if(pos[g[ans[i]][j]]>i) {   printf("-1\n");return 0;}	}	printf("%d\n",ans.size());	for(int i:ans) printf("%d ",i);}
上一篇:Codeforces Round #381 (Div. 1) B. Alyona and a tree (树上差分)
下一篇:PAT顶级 1027 Larry and Inversions (35分)(树状数组)

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年03月24日 16时15分54秒