scau 拓扑排序

18734 拓扑排序

时间限制:1000MS  代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC

Description

在经历.....之后,你打算好好学习下计算机专业的课程,避免面试过程中的各种尴尬场面。
计算机的专业课程间既有循序渐进的特点,相互间也存在着依赖关系(似乎其他专业也是这样......)。
现在给你n门课程和m个课程间关系,请给出一个有效的学习次序。
注意可能存在多门课程不依赖任何其他课程



 

输入格式

第一行有2个数,分别为课程数n和关系数m。     (1=<n<=20) (1=<m<=30) 
接下来有m行,每一行有2个整数a和b,表示课程b依赖于课程a。(1=<a,b<=n) 


 

输出格式

仅一行,一个整数序列,代表课程学习次序。
为确保输出唯一性,同等条件下,编号小的在排在前面。


 

输入样例

6 8
1 2
1 3
1 4
3 2
3 5
4 5
6 4
6 5


 

输出样例

1 3 2 6 4 5


 

提示

图片来源于今日头条。
#include<iostream>
#include<queue>
#include<algorithm>

using namespace std;
int e[505][505],d[505];
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;++i){
		int x,y;
		cin>>x>>y;
		e[x][y]=1;
		d[y]++;
	}
	priority_queue<int,vector<int>,greater<int> >q;
	for(int i=1;i<=n;++i){
		if(d[i]==0){
			q.push(i);
		}
	}
	while(!q.empty()){
		int t=q.top();
		q.pop();
		cout<<t<<' ';
		for(int i=1;i<=n;++i){
			if(e[t][i]==1){
				d[i]--;
				if(d[i]==0){
					q.push(i);
				}
			}
		}
	}
	return 0;
} 

19011 小猿的依赖循环

时间限制:1000MS  代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC

Description

猿辅导2021校园招聘笔试(算法二) 
小猿在加载一个网页,这个网页共需要N个相关资源,这些资源之间有一些依赖关系。
如果这些资源中存在循环依赖,我们认为这个网页不能加载成功,否则可以加载成功。
存在循环依赖是指,这些资源中存在资源X,X依赖的资源Y直接或间接依赖于X。
你能帮助小猿判断一下这个网页能否加载成功吗?


 

输入格式

第一行输入T(T ≤ 10),表示输入T组数据。
每组数据第1行,输入一个数N(1 ≤ N ≤ 500)表示该组case有编号为1~N的N项资源。
每组数据第2到 N+1 行,输入一个 N*N 的零一矩阵。
矩阵第 i 行第 j 列数字为 a[i][j] 表示编号为 i 的资源是否依赖于编号为 j 的资源,1表示依赖,0表示不依赖。数据保证a[i][i] = 0。
 

输出格式

输出包含T行,每行输出对应每组case中是否存在循环依赖。存在输出1,不存在输出0。
 

输入样例

2
3
0 1 0
0 0 1
1 0 0
3
0 1 0
0 0 0
0 0 0
 

输出样例

1
0
 

提示

第一组数据:1依赖于2,2依赖于3,3依赖于1,存在循环依赖。第二组数据:只有1依赖于2,不存在循环依赖。
提示:既然是有向无环图,做一下拓扑排序看看能不能输出n个数字,不能就是有环存在。
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>

using namespace std;
int e[505][505],d[505];
int main() {
	int t;
	cin>>t;
	while(t--) {
		memset(e,0,sizeof(e));
		memset(d,0,sizeof(d));
		int n;
		cin>>n;
		for(int i=1;i<=n;++i){
			for(int j=1;j<=n;++j){
				cin>>e[i][j];
				if(e[i][j]==1){
					d[i]++;
				}
			}
		}
		priority_queue<int,vector<int>,greater<int> >q;
		for(int i=1; i<=n; ++i) {
			if(d[i]==0) {
				q.push(i);
			}
		}
		int cnt=0;
		while(!q.empty()) {
			int tmp=q.top();
			q.pop();
			cnt++;
			for(int i=1; i<=n; ++i) {
				if(e[i][tmp]==1) {
					d[i]--;
					if(d[i]==0) {
						q.push(i);
					}
				}
			}
		}
		if(cnt==n){
			cout<<"0"<<endl;
		}else{
			cout<<"1"<<endl;
		}
	}
	return 0;
}

19017 编译依赖问题(拓扑排序)

时间限制:1000MS  代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC

Description

vivo2021届秋季校招在线编程 
一个完整的软件项目往往会包含很多由代码和文档组成的源文件。编译器在编译整个项目的时候,可能需要按照依赖关系来依次编译每个源文件。
比如,A.cpp 依赖 B.cpp,那么在编译的时候,编译器需要先编译 B.cpp,才能再编译 A.cpp。
 假设现有 0,1,2,3 四个文件,0号文件依赖1号文件,1号文件依赖2号文件,3号文件依赖1号文件,则源文件的编译顺序为 2,1,0,3 或 2,1,3,0。
现给出文件依赖关系,如 1,2,-1,1,表示0号文件依赖1号文件,1号文件依赖2号文件,2号文件没有依赖,3号文件依赖1号文件。
请补充完整程序,返回正确的编译顺序。注意如有同时可以编译多个文件的情况,
按数字升序返回一种情况即可(简单说就是选择序号最小的),比如前述案例输出为:2,1,0,3



 

输入格式

一个字符串,代表要编译的文件依赖关系。文件编号小于100。


 

输出格式

一个序列,代表编译顺序,两个数字间用空格分隔。


 

输入样例

1,2,-1,1


 

输出样例

2,1,0,3


 

提示

按原题要求,输入序列是一个字符串,输出序列也是一个字符串形式。

#include<iostream>
#include<queue>
#include<string> 
#include<algorithm>

using namespace std;
int d[105],a[105],e[105][105];
int main() {
	string s;
	cin>>s;
	int i=0,n=1,j=0;
	while(s[i]){
		if(s[i]==','){
			i++;
		}else if(s[i]=='-'){
			int sum=0;
			i++;
			while(s[i]!=','&&s[i]){
				sum=sum*10+s[i++]-'0';
			}
			//cout<<sum<<endl;
			sum=0-sum;
			a[n++]=sum;
		}else{
			int sum=0;
			while(s[i]!=','&&s[i]){
				sum=sum*10+s[i++]-'0';
			}
			a[n++]=sum;
		}
	}
	n--;
	//cout<<n<<endl;
	for(i=0;i<n;++i){
		j=i+1;
		if(j<=n&&a[j]!=-1){
			e[i][a[j]]=1;
			d[i]++;
		}
	}
	priority_queue<int,vector<int>,greater<int> >q;
	for(int i=0; i<n; ++i) {
		if(d[i]==0) {
			q.push(i);
		}
	}
	int cnt=0;
	while(!q.empty()) {
		int t=q.top();
		q.pop();
		a[++cnt]=t;
		for(int i=0;i<n;++i){
			if(e[i][t]){
				q.push(i);
			}
		}
	}
	cout<<a[1];
	for(i=2;i<=cnt;++i){
		cout<<","<<a[i];
	}
	return 0;
}











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值