给出一定的数据,前面的名次大于后面的,求最终排名
跨过了字典树,迎来了拓扑排序。
整体的算法是这样的
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include<malloc.h>
using namespace std;
#define MAX 510
int M,N,a,b;
int Map[MAX][MAX];//图
int res[MAX];//存放结果
int Out[MAX];
void Sort(){
int k = 0 ;
for(int i = 1 ;i <=N ;i++)
{
//每次找一个,因为每次都有一个Break
for(int j = 1 ; j<= N ; j ++)
{
if(Out[j]==0)
{
Out[j]--;
res[k++] = j ;
for(int l= 1 ; l <=N ; l++)
{
if(Map[j][l])
Out[l]--;
}
break ;
}
if(j==N)
{
printf("wa");
return ;
}
}
}
}
int main(){
while(~scanf("%d%d",&N,&M))
{
memset(Out,0,sizeof(Out));
memset(Map,0,sizeof(Map));
for(int i = 1 ; i <= M ;i++)
{
scanf("%d%d",&a,&b);
if(!Map[a][b])
{
Map[a][b]=1;
Out[b]++;
}
}
Sort();
for(int i = 0 ; i <N ; i++)
{
if(i==0)
cout <<res[i];
else
cout <<" "<< res[i];
}
cout <<endl;
}
return 0 ;
}
参考博客:点击打开链接