题解

题目难度:中等

知识点:图、拓扑排序

解题思路:我们在研究题意时,发现在比较排序中存在一个关系,总是两两进行对比的。因此,整个大小关系类似于一个拓扑形状,总会是在一个前提下进行下一步的。因此,整个流程我们可以通过拓扑排序来进行解答。

拓扑关系
1 2 2—>1
2 3 3—>2
4 3 3—>4

注意:拓扑关系跟赢负是相反的。一定不要弄反了!!
建立图和度和,直接通过拓扑关系就可以输出排序。

#include <stdio.h>
#include <string.h>
#define N 501
//创建一个度和图
int Indegree[N];
int Graph[N][N];
int main(){
    int n,m;
    int a,b;
    int count;
    while(scanf("%d %d",&n,&m) != EOF){
        //对图和度进行初始化
        memset(Graph,0,sizeof(Graph));
        memset(Indegree,0,sizeof(Indegree));
        count = 0;
        //对度和图进行一个赋值
        for(int i = 0; i < m; i++){
            scanf("%d %d",&a,&b);
            if(Graph[a][b] == 0){
                Graph[a][b] = 1;
                Indegree[b]++;
            }
        }
        //开始循环拓扑
        for(int i = 0; i < n; i++){
            int flag = n + 1;
            for(int j = 1; j <= n; j++){
                if(Indegree[j] == 0){
                    Indegree[j] = -1;
                    flag = j;
                    count++;
                    break;
                }
            }
            if(flag == n + 1)
                return 0;//若一趟查找,没有可拓扑的顶点,直接退出
            if(count == 1){
                printf("%d",flag);
            }
            else{
                printf(" %d",flag);
            }
            for(int k = 1; k <= n; k++){//更新图信息
                if(Graph[flag][k] == 1){
                    Indegree[k]--;
                }
            }
        }
        printf("\n");
    }
    return 0;
}