HDU 1285 确定比赛名次

题解:裸的topo,注意判重,由于数据升序所以免排序。

#include <cstdio> 

#include <iostream>

using namespace std;

#define N 505

int map[N][N],n,m,a,b,in[N],ans[N];

void topo(){

    int top=0,i;

    memset(ans,0,sizeof ans);

    while(true){

        for(i=1;i<=n;i++)if(in[i]==0)break;

        if(i==n+1)return;

        in[i]=-1;

        ans[top++]=i;

        for(int x=1;x<=n;x++)if(map[i][x])in[x]--;

    }

}

int main(){

    while(~scanf("%d%d",&n,&m)){

        memset(map,0,sizeof map);

        memset(in,0,sizeof in);

        for(int i=0;i<m;i++){

            scanf("%d%d",&a,&b);

            if(!map[a][b]){

                map[a][b]++;

                in[b]++;

            } 

        }

        topo();

        printf("%d",ans[0]);

        for(int i=1;i<n;i++)printf(" %d",ans[i]);

        printf("\n");

    }

}

你可能感兴趣的:(HDU)