hdu 1285 確定比賽名次(拓撲排序)

這裏寫圖片描述

拓撲排序模板題,不用任何的數據結構優化,時間複雜度最高的拓撲排序都能過的題~開森

代碼講解:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int mp[510][510], seg[510];//mp數組是鄰接矩陣,存放的是二元關係。seg矩陣存的是前驅個數。

void topsort(int n){
    for(int i = 1; i <= n;i++)//遍歷n遍
        for(int j = 1; j <= n;j++)//遍歷n個點
            if(seg[j] == 0){//點j無前驅
                seg[j]--;
                if(i == n)printf("%d\n",j);//輸出該點
                else printf("%d ",j);
                for(int k = 1; k <= n;k++)//修改剩下的前驅,將原本以j爲前驅的點,前驅個數減一
                    if(mp[j][k] == 1)//兩點之前有聯繫
                        seg[k]--;
                break; 
            }
}

int main(){
    int n ,t;
    while(~scanf("%d%d",&n,&t)){
     memset(mp, 0, sizeof(mp));
     memset(seg, 0, sizeof(seg));
     while(t--){
        int u ,v;
        cin >> u >> v;
        if(!mp[u][v]){
            mp[u][v] = 1;//兩點之間建立聯繫
            seg[v]++;//v點前驅加一
        }
      } 
      topsort(n);//拓撲排序
    }
    return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章