列表

详情


NC26144. Homework Stream

描述

作为大珩班尖子生,小r每天有很多作业要完成,例如工图、工图和工图。

很显然,做作业是要有顺序的。作业之间存在依赖关系,某一个作业没做完,就不能开始做另一个作业。例如,汇编作业依赖于C语言作业,因为小r可以用C语言的编译结果反编译出他想要的汇编程序。

现在已知有n种作业(编号为1~n)和m对作业之间的依赖关系,小r想知道编号为k的作业依赖于哪些作业,以及哪些作业依赖于编号为k的作业。

输入描述

第一行输入三个正整数,含义见题目描述。

接下来m行,每行两个正整数,代表作业x_i依赖于y_i

输入保证不存在重复的依赖关系,也不存在环形的依赖关系。

输出描述

输出共两行。

第一行输出编号为k的作业依赖的作业编号,每个数用空格隔开。

第二行输出依赖于编号为k的作业的编号,每个数也用空格隔开。

每行输出的作业编号顺序任意。

示例1

输入:

5 4 3
3 1
3 2
4 3
5 3

输出:

1 2
4 5

示例2

输入:

3 2 1
2 1
3 2

输出:

<br/>2

说明:

如果没有依赖或被依赖的作业,也要输出空行(即必须一共输出两个换行符)

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 615ms, 内存消耗: 13664K, 提交时间: 2019-06-08 14:16:25

#include<bits/stdc++.h>
using namespace std;
long long int x[1000001],y[1000001];
int main()
{	int n,m,k,i;
		
	while(cin>>n>>m>>k)
{
	 if(n!=0&&m!=0&&k!=0) 
	for(i=0;i<m;i++)
	{cin>>x[i]>>y[i];
}

	for(i=0;i<m;i++)
	if(x[i]==k)
	{	
	printf("%lld ",y[i]);

	}
	cout<<endl;
	for(i=0;i<m;i++)
	 if(y[i]==k)
	{
	cout<<x[i]<<" ";
	}
cout<<endl;
	}
}

C++11(clang++ 3.9) 解法, 执行用时: 332ms, 内存消耗: 6992K, 提交时间: 2019-06-08 12:53:05

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int x[N],y[N],n,m,k;
int main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++)	scanf("%d %d",&x[i],&y[i]);
	for(int i=1;i<=m;i++)
		if(x[i]==k)	printf("%d ",y[i]);
	cout<<endl;
	for(int i=1;i<=m;i++)
		if(y[i]==k)	printf("%d ",x[i]);
	cout<<endl;
	return 0;
}

上一题