确定比赛名次 hdu 拓扑输出字典序最小解
#include <stdio.h>#include <cstring>const int maxn=501;int map[maxn][maxn];int in[maxn];int ans[maxn];int main(){ int n,m,u,v; while(scanf("%d%d",&n,&m)==2) { memset(in,0,sizeof(in)); memset(map,0,sizeof(map)); memset(ans,0,sizeof(ans)); for(int i=1; i<=m; i++) { scanf("%d%d",&u,&v); map[u][v]=1; } for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) in[j]+=map[i][j]; int i,j,k; for(i=1; i<=n; i++) { for(j=1; j<=n; j++) if(in[j]==0) break; in[j]=-1; ans[i]=j; for(k=1; k<=n; k++) in[k]-=map[j][k];//将所有和j相连的点的入度-1 } for(int i=1; i<n; i++) printf("%d ",ans[i]); printf("%d\n",ans[n]); } return 0;}