描述
在网易游戏的日常工作中,C++ 是一门常用的语言。面对众多的 C++ 代码,等待源文件编译的漫长时间是个令人糟心的时刻,一直以来大家对此怨声载道。终于有一天,大家找到了你,一位优秀的程序员,请你来帮忙分析一下编译速度的瓶颈。
经过一番调查和研究,你发现一些源代码之间是有依赖关系的。例如,某个源文件 a.cpp 编译链接生成了动态链接库 a.dll,而 b.cpp 编译链接生成的 b.dll 依赖于 a.dll。这个时候,必须等待 a.dll 生成之后才能生成 b.dll。为了表达简单,我们这个时候称 b.cpp 依赖于 a.cpp。
网易游戏内部使用了一个分布式并行的编译平台,可以同时编译多个不互相依赖的文件,大大提高了源代码的编译速度。然而当某些依赖链很长的时候,这个编译平台也无能为力,只能按照依赖顺序一个一个完成编译,从而造成了很长的编译时间。
为了验证这个想法,你决定着手通过代码分析这些文件之间的编译顺序。已知这些文件的文件名,以及这些文件所依赖的其他文件,你需要编写一个程序,输出一个可行的编译所有源文件的编译顺序。如果有多种可行的序列,请输出所有文件名序列中字典序最小的那一个(序列 (a1, a2, ..., an) 字典序小于序列 (b1, b2, ..., bn),当且仅当存在某个 i ,使得 ai 的字典序小于 bi,并且对于任意 j < i ,都有 aj = bj)。
输入
输入包含多组测试数据。
输入的第一行包含一个整数 T(T ≤ 100),表示输入中一共包含有 T 组测试数据。
每组测试数据第一行是一个整数 N(N ≤ 1000),表示一共有 N 个源代码文件。随后一共有 N 行数据,其中第 i(0 ≤ i < N) 行数据包含序号为 i 的源代码文件的依赖信息。每一行开头是一个字符串,表示这一个文件的文件名,随后一个整数 m(0 ≤ m ≤ N),表示编译这个源文件之前需要先编译 m 个依赖文件。之后是 m 个整数 j0 ... jm-1,表示这 m 个依赖文件的序号(0 ≤ j < N) 。所有的文件名仅由小写字母、数字或“.”组成,并且不会超过 10 个字符。保证 n 个源代码文件的文件名互不相同。
输出
对于每一组输入,按照编译先后顺序输出一组可行的编译顺序,一行一个文件名。如果有多种可行的序列,请输出所有文件名序列中字典序最小的那一个。如果不存在可行的编译顺序,输出一行 ERROR。每组测试数据末尾输出一个空行。
样例输入
3
2
a.cpp 0
b.cpp 1 0
2
cb 0
c 0
2
a.cpp 1 1
b.cpp 1 0
样例输出
a.cpp
b.cpp

c
cb

ERROR
这个题思路也比较明显,拓扑排序,有环的时候就是ERROR。由于要按照字典序输出,所以还要排序。

  1 #include <iostream>
  2 #include <vector>
  3 #include <string>
  4 #include <map>
  5 #include <queue>
  6 #include <sstream>
  7
  8 using namespace std;
  9
 10 void cacIndgeee(vector<vector<int>> &G,vector<int>& inde)
 11 {
 12     for(int i=0;i<G.size();i++)
 13     {
 14         vector<int> gv=G[i];
 15         for(int j=0;j<gv.size();j++)
 16         {
 17             inde[gv[j]]++;
 18         }
 19     }
 20 }
 21
 22 int main()
 23 {
 24     int T,N;
 25     int m,t,s;
 26     string fname;
 27     cin>>T;
 28     ostringstream os;
 29     for(int i=0;i<T;i++)
 30     {
 31         vector<string> file;
 32         map<string,int> mapIndex;
 33         cin>>N;
 34         bool noError=true;
 35         priority_queue<string,vector<string>,greater<string>> q;
 36         int count =0;
 37         vector<string> vresult;
 38         vector<vector<int>> G(N);
 39         vector<int> indegree(N,0);
 40         for(int j=0;j<N;j++)
 41         {
 42             count =0;
 43             cin>>fname>>m;
 44             file.push_back(fname);
 45             mapIndex[fname]=j;
 46             for(int k=0;k<m;k++)
 47             {
 48                 cin>>t;
 49                 G[t].push_back(j);
 50             }
 51         }
 52         cacIndgeee(G,indegree);
 53         for(int j=0;j<N;j++)
 54         {
 55             if(!indegree[j])
 56             {
 57                q.push(file[j]);
 58             }
 59         }
 60         while(!q.empty())
 61         {
 62             s=mapIndex[q.top()];
 63             q.pop();
 64             count++;
 65             vector<int> gv=G[s];
 66             vresult.push_back(file[s]);
 67             for(int k=0;k<gv.size();k++)
 68             {
 69                 int r=gv[k];
 70                 --indegree[r];
 71                 if(!indegree[r])
 72                     q.push(file[r]);
 73             }
 74         }
 75         if(count<N)
 76         {
 77             noError= false;
 78         }
 79         if(!noError)
 80         {
 81             os<<"ERROR"<<endl;
 82         }
 83         else
 84         {
 85             for(int i=0;i<vresult.size();i++)
 86             {
 87                 os<<vresult[i]<<endl;;
 88             }
 89         }
 90         os << endl;
 91     }
 92     cout<<os.str();
 93     return 0;
 94 }
 95 /*
 96 1
 97 5
 98 11.cpp 0
 99 33.cpp 1 0
100 22.cpp 1 0
101 44.cpp 1 2
102 55.cpp 2 1 3
103
104 1
105 7
106 aa 0
107 bb 1 0
108 cc 1 0
109 ff 1 0
110 dd 1 1
111 ee 2 2 3
112 gg 2 4 5
113 */

转载于:https://www.cnblogs.com/wzqx/p/5878914.html

网易互娱2017实习生招聘在线笔试--源代码编译相关推荐

  1. 网易互娱2017实习生招聘在线笔试(二)

    题目2 : 源代码编译 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在网易游戏的日常工作中,C++ 是一门常用的语言.面对众多的 C++ 代码,等待源文件编译的漫长时 ...

  2. 网易互娱2017实习生招聘在线笔试第一场-2源代码编译

    http://hihocoder.com/contest/ntest2016spring1/problem/2 拓扑排序 处理一下字符串 没什么好说的.. 时间限制:10000ms 单点时限:1000 ...

  3. 网易互娱2017实习生招聘在线笔试(三)

    题目3 : 画线 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小王最近在开发一种新的游戏引擎,但是最近遇到了性能瓶颈.于是他打算从最基本的画线功能开始分析优化.画线其 ...

  4. 网易互娱2017实习生招聘在线笔试(一)

    题目1 : 电子数字 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 电子数字在生活中很常见,而许多的电子数字是由LED数码管制作而成.数字LED数码管一般由7个发光二极 ...

  5. 网易互娱2017实习生招聘在线笔试第一场-3划线

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小王近期在开发一种新的游戏引擎,可是近期遇到了性能瓶颈.于是他打算从最主要的画线功能開始分析优化. 画线事实上就是调用 ...

  6. 网易互娱2017实习生招聘在线笔试第一场-题目3

    题目3 : 画线 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小王最近在开发一种新的游戏引擎,但是最近遇到了性能瓶颈.于是他打算从最基本的画线功能开始分析优化.画线其 ...

  7. 网易互娱2017实习生招聘在线笔试第一场-1电子数字

    http://hihocoder.com/contest/ntest2016spring1/problem/1 时间限制:10000ms 单点时限:1000ms 内存限制:256MB  描述  电子数 ...

  8. 网易互娱2017实习生招聘在线笔试第一场-电子数字

    题目1 : 电子数字 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 电子数字在生活中很常见,而许多的电子数字是由LED数码管制作而成.数字LED数码管一般由7个发光二极 ...

  9. 网易互娱2017实习生招聘在线笔试第一场 题目1 : 电子数字

    http://hihocoder.com/contest/ntest2016spring1/problem/1 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 电子数字在 ...

最新文章

  1. 基于地面几何约束的单目视觉里程计精确鲁棒尺度恢复(ICRA 2021)
  2. 感知机模型及其对偶形式
  3. 软件设计师笔记---流水线
  4. 有关UNICODE、ANSI字符集和相关字符串操作的总结[转]
  5. response对象简介
  6. 什么可以作为gcroot_面包果既能当水果又可以作为粮食,国内却无法普及,这是为什么?...
  7. 探索比特币源码1-运行 Bitcoin Core Node
  8. 离岸人民币兑美元升破6.50关口
  9. python内核_python-在多处理模块中使用所有内核的100%
  10. 由于BOM头导致的Json解析出错
  11. gluster分布式存储 入门篇
  12. Java经典编程习题100例,供初学者学习
  13. 条形码扫描仪行业调研报告 - 市场现状分析与发展前景预测
  14. 互联网寒冬的思考,程序员该如何突破瓶颈?
  15. 什么是属性,字段,变量,方法
  16. Vue中设置浏览器标签栏图标以及title
  17. Android studio下载插件失败问题
  18. 古人的名与字、号、讳、谥有什么区别
  19. Perforce使用中文教程: p4 client
  20. Debian / Ubuntu 系统怎么缩短 shell 路径(转)

热门文章

  1. Python str()函数
  2. rgb 接口lcd 驱动调试
  3. 计算机函数sumif求平均值,用sumif函数如何求平均值
  4. 微信小程序使用wxparse插件,渲染文章不换行问题
  5. 英语自然拼读法基本规则和小窍门
  6. GEO-BYB型振弦式表面应变计的主要作用
  7. 微软编程规范(文档)
  8. html 写字板 乱码,Win7系统写字板打开文档出现乱码的两种解决方法
  9. bzoj4998 星球联盟
  10. 算法题——立方体的体对角线穿过多少个正方体?