POJ 3687 Labeling Balls

无奈了,巨坑陷阱题加读错题导致了N个WA。

题意是这样的:

给定几个标签球的重量大小关系,求每个球是第几重的(即每个球在所有球的重量中由小到大排名是多少)。

(输出是每个球第几重,而不是几号球比几号球重!)。

此题重点是:

1、需要逆序拓扑,找入读为零的点时要从大到小找。

2、注意最后的处理,是输出几号球是第几重的!!

      例如:拓扑出的序列是1 4 2 3 5,就是4号球比1号球重,2号球比4号球重,输出序列是1 3 4 2 5,即1号球最轻,2号球第三轻……

是不是你也突然发现你读错题了?

下面是代码:

#include <stdio.h>
#include <string.h>
const int M=205;
int n,cut,head[M],map1[M][M],ji[M];
int topo()
{
    int i,in=-1,ind,di[M],j,k;
    cut=0;
    for(i=0; i<n; i++)
    {
        di[i]=0;
        for(j=0; j<n; j++)
        {
            di[i]+=map1[j][i];
        }
    }
    for(i=0; i<n; i++)
    {
        for(j=n-1; j>=0; j--)
        {
            if(di[j]==0)
            {
                di[j]=-1;
                break;
            }
        }
        if(j==-1)
        {
            return 0;
        }
        for(k=0; k<n; k++)
        {
            di[k]-=map1[j][k];
        }
        ji[i]=j;
    }
    return 1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int i,m,flat=1,a,b,ans[M];
        scanf("%d%d",&n,&m);
        memset(map1,0,sizeof(map1));
        for(i=0; i<m; i++)
        {
            scanf("%d%d",&a,&b);
            a--;
            b--;
            map1[b][a]=1;
        }
        i=topo();
        if(i)
        {
            for(i=0; i<n; i++)//最后的数据处理
            {
                ans[ji[i]+1]=n-i;
            }
            for(i=1; i<n; i++)
            {
                printf("%d ",ans[i]);
            }
            printf("%d\n",ans[n]);
        }
        else
        {
            printf("-1\n");
        }
    }
    return 0;
}


posted @ 2013-08-09 15:44  、小呆  阅读(95)  评论(0编辑  收藏  举报