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 题型: 编程题 语言: 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;
}