原题链接:J-清楚姐姐学排序_2023牛客寒假算法基础集训营4 (nowcoder.com)
思路:一道表面说排序,实际上是建图的题,根据输入的条件同时建立一个正向和反向的图,用dfs分别搜索,复杂度为n2,不过该题的n<=1000,所以n3的Floyd也可以试一试,我这里用的是Floyd建的图。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i,j,k,n,m;
int a[1005][1005]={0},ans[1005];
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
a[x][y]=1;
}
for(i=1;i<=n;i++)ans[i]=-1;
for(k=1;k<=n;k++){
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
a[i][j]=a[i][j]|(a[i][k]&a[k][j]);
}
}
}
for(i=1;i<=n;i++){
int b=0,s=0;
for(j=1;j<=n;j++){
if(a[i][j]){
b++;
}else if(a[j][i]){
s++;
}else if(j!=i)break;
}
if(b+s==n-1)ans[s+1]=i;
}
for(i=1;i<=n;i++){
printf("%d ",ans[i]);
}
return 0;
}