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

浙公网安备 33010602011771号