拓撲排序模板題,不用任何的數據結構優化,時間複雜度最高的拓撲排序都能過的題~開森
代碼講解:
#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;
}