题解
题目难度:中等
知识点:图、拓扑排序
解题思路:我们在研究题意时,发现在比较排序中存在一个关系,总是两两进行对比的。因此,整个大小关系类似于一个拓扑形状,总会是在一个前提下进行下一步的。因此,整个流程我们可以通过拓扑排序来进行解答。
赢 | 负 | 拓扑关系 |
---|---|---|
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; }