1. 程式人生 > >網易互娛2017實習生招聘線上筆試第一場-2原始碼編譯

網易互娛2017實習生招聘線上筆試第一場-2原始碼編譯

http://hihocoder.com/contest/ntest2016spring1/problem/2

拓撲排序

處理一下字串

沒什麼好說的。。


時間限制:10000ms
單點時限:1000ms
記憶體限制:256MB
描述:
在網易遊戲的日常工作中,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


#include<iostream>
#include<string.h>
#include<string>
#include<queue>
#include<map>
using namespace std;

#define rep(i,n) for(int i=0;i<n;i++)
#define mst(k,j) memset(k,j,sizeof(k))
#define MAXN 1002
struct cmp{  
    bool operator()(string a,string b)  
    {  
		return a>b;
    }  
};  
priority_queue<string,vector<string>,cmp> strlist;
map<string,int> mslist;
map<int,string> milist;
vector<int> vlist[MAXN];
vector<string> ans;
int indx[MAXN];
int n,k,h,g;
string str,str1;

int main(){
	int T;
	cin>>T;
	while(T--){
		while(!strlist.empty()){
			strlist.pop();
		}
		mslist.clear();milist.clear();ans.clear();
		rep(i,MAXN) vlist[i].clear();  //這幾個clear方法太笨,應該改一下
		mst(indx,0);
		cin>>n;
		rep(i,n){
			cin>>str;
			cin>>k;
			mslist[str]=i;
			milist[i]=str;
			if(k==0)
				strlist.push(str);
			else{
				rep(j,k){
					cin>>h;
					vlist[h].push_back(i);
					indx[i]++;
				}
			}
		}
		h=0;
		while(!strlist.empty()){
			str=strlist.top();
			strlist.pop();
			h++;
			ans.push_back(str);
			k=mslist[str];
			rep(i,vlist[k].size()){
				g=vlist[k][i];
				if(--indx[g]==0){
					str1=milist[g];
					strlist.push(str1);
				}
			}
		}
		if(h==n){
			rep(i,n)
				cout<<ans[i]<<endl;
			cout<<endl;
		}
		else
			cout<<"ERROR"<<endl<<endl;
	}
}