HDU1285——确定比赛名次

99 阅读1分钟
  • 有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。 \

Input

  • 输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。 \

Output

  • 给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。 

    其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。 \

Sample Input

  • 4 3
    1 2
    2 3
    4 3
    

Sample Output

  • 1 2 4 3
    

    \

    中文题就不说题意了,注意题目要求,如果有多种答案就要输出编号小的队伍在前。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std; 
    const int mx = 505;
    int ma[mx][mx], lis[mx], in[mx], vis[mx];
    int m, n;
    
    void out(){
    		printf("%d", lis[1]);
    	for(int i= 2; i <= n; i++)
    		printf(" %d", lis[i]);
    	puts("");
    } 
    
    void topu(){
    	int cen = 0, u;
    	queue<int> q;
    	while(!q.empty()) q.pop();
    	
    	
    	for(int i = 1; i <= n; i++){
    		if(in[i] == 0){				//花括号忘了写,直接break 
    			q.push(i); 
    			break; 
    		}
    	}
    
    	while(!q.empty()){
    		u = q.front();
    		q.pop();
    		
    		lis[++cen] = u;
    		if(n == cen) {
    		out();
    		return;
    		}
    		
    		in[u] = -1;
    		for(int i = 1; i <= n; i++)
    			if(ma[u][i] && in[i] > 0){
    				in[i]--;
    			} 
    		
    		for(int i = 1; i <= n; i++)
    			if(in[i] == 0){
    				q.push(i);
    				break; 
    			}  
    	}
    //	out();
    }
    
    
    int main(){
    	while(scanf("%d%d", &n, &m) != EOF){
    		memset(ma, 0, sizeof(ma));
    		memset(in, 0, sizeof(in));
    		memset(vis, 0, sizeof(vis));
    		int a, b;
    		while(m--){
    			scanf("%d%d", &a, &b);
    			if(! ma[a][b]){
    			ma[a][b] = 1;
    			in[b] += 1;
    			}
    		}
    	//for(int i=1; i <= n; i++)
    	//	cout<<in[i]<<endl;
    		
    		topu();
    		
    	}
    	
    	return 0;
    } 
    


    \

本文已参与「新人创作礼」活动,一起开启掘金创作之路