HDU --- 1285 确定比赛名次

最简单的拓补排序
用邻接矩阵模仿来写的
大数据可能处理不了
题意:
中文题直接看链接吧

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

}

猜你喜欢

转载自blog.csdn.net/qq_42894605/article/details/82425254