最简单的拓补排序
用邻接矩阵模仿来写的
大数据可能处理不了
题意:
中文题直接看链接吧
#include<iostream>
#include<string>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std ;
/*
思路:
直接找一场都没输过的,这肯定是第一名,然后把第一名加入队列(这里用数组模仿队列)
然后把与第一名相关的比赛中输的一方的所输的场次减一 , 然后在每次减一的时候肯定会
出现一个第一名(也就是说你在减的时候回出现个输的场次为0的人 , 而这个人就是当时的第一名)
就这样一直反复循环 ,就可以得出名次了 。
*/
int arr[1050][1050] ;
int st[100000] ;
int n , m ;
int prim[100000 ] ;
void solve (){
memset(prim , 0 , sizeof(prim)) ;
int cnt = 0 ;
for(int i = 1 ; i <= n ; i++){
for( int j = 1 ; j <= n ; j++ )
{
if(st[j] == 0 ) { prim[cnt++] = j ; st[j] = -1 ; break ; }
}
for(int j = 0 ; j <= n ; j++){
if(arr[prim[cnt-1]][j] != 0 ) st[j]-- ;
}
}
cout << prim[0] ;
for(int i = 1 ; i < n ; i ++){
cout << " " << prim[i] ;
}
cout << endl ;
return ;
}
int main(){
while(cin >> n >> m ){
memset(arr , 0 , sizeof(arr)) ;
memset(st , 0 , sizeof(st) ) ;
int a , b ;
for(int i = 0 ; i < m ; i++){
scanf("%d %d",&a ,&b) ;
if(arr[a][b] == 0 ){
arr[a][b] = 1 ;
st[b]++ ;
}
}
solve() ;
}
}