xmu 1073: 選課(拓撲排序的簡單應用)

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

提示

來源

xmu



思路:完成一次簡單的拓撲排序就可以。

代碼:

#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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章