1073: 選課
題目描述
計算機繫有很多課程,比如數學分析、高等代數、計算機導論、C語言程序設計、面向對象程序設計、數據結構、算法設計與分析、數理邏輯、彙編程序設計、編譯原理等等。其中有些課程是需要前面一些課程的基礎,比如要修數據結構這麼課必須先修C語言程序設計。
現在有一位外系學生想通過自學掌握計算機系所有的課程,他來找正在計算機系就讀的您來給他自學課程的順序提個建議。
輸入
輸入的第一行是一個正整數N(0 < N <= 500),表示計算機系總共需要修的課程的數目。課程從1-N編號。
輸入的第二行包括N個課程的名字,每個課程名字由大寫字母或小寫字母或下劃線組成,最長不超過40個字符,每兩個相鄰的名字用空格隔開。
輸入的第三行到N+2行數據描述課程之間的依賴關係。第i+2行描述第i個課程的依賴關係,格式如下:
Mi m1 m2 m3 ... mMi
其中Mi表示要修第i個課程共需要先修Mi個課程,後面跟隨着Mi個課程編號,編號從小到大排列。
輸出
輸出N個課程的名字表示您建議的順序,如果存在多個序列則您只需要輸出其中任意一個。如果沒有辦法找到這樣的序列則輸出"Impossible!"(不需要輸出引號,但是要輸出感嘆號,注意大小寫)。
樣例輸入
9
Introduction_to_Computer_Science C_Programming_Language Data_Structure Design_and_Analysis_of_Algorithms Mathematical_Analysis Advanced_Algebra Probability_and_Statistics Numerical_Analysis Operating_System
0
1 1
2 1 2
3 1 2 3
0
0
1 5
2 5 6
2 1 2
樣例輸出
Introduction_to_Computer_Science Mathematical_Analysis Advanced_Algebra C_Programming_Language Probability_and_Statistics Data_Structure Design_and_Analysis_of_Algorithms Numerical_Analysis Operating_System
提示
來源
代碼:
#include<bits/stdc++.h>
#define maxn 510
using namespace std;
char name[maxn][50];
int Map[maxn][maxn],deg[maxn];
int N;
int vis[maxn];
void top_sort(){//普通的拓撲排序
queue<int> Q;
memset(vis,0,sizeof(vis));
for(int i=1;i<=N;i++)
if(!deg[i]) Q.push(i),vis[i]=1;
vector<int> ans;//先存儲下來,因爲有可能爲impossible
while(!Q.empty()){
int tp=Q.front();Q.pop();
ans.push_back(tp);
for(int i=1;i<=N;i++) if(!vis[i] && Map[tp][i])
if(--deg[i]==0) Q.push(i),vis[i]=1;
}
if((int)ans.size()<N){printf("Impossible!\n");return;}
for(int i=0;i<ans.size();i++)
printf("%s%c",name[ans[i]],i+1==ans.size()? '\n':' ');
}
int main(){
//freopen("in.txt","r",stdin);
while(cin>>N){
for(int i=1;i<=N;i++)
scanf("%s",name[i]);
memset(Map,0,sizeof(Map));
memset(deg,0,sizeof(deg));
for(int i=1;i<=N;i++){
int t,a;
scanf("%d",&t);
deg[i]=t;
while(t--){
scanf("%d",&a);
Map[a][i]=1;
}
}
top_sort();
}
return 0;
}