POJ 3660 Cow Contest floyd传递闭包

  http://poj.org/problem?id=3660

题意:N头牛进行比赛,问有几头牛可以确定次序

读完题立马想到拓扑排序,写出来WA了N久,最后查的解题报告是传递闭包,某头牛前面和后面的牛加起来等于n-1时,则该牛的次序确定,这个思路还是lmy想出来的,就是搞数学的啊,理性思维

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define nMAX 102
using namespace std;
int map[nMAX][nMAX],in[nMAX],out[nMAX];
int n;
void floyd()
{
    int i,j,k;
    for(k=1;k<=n;k++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
            {
                if(map[i][j])continue;
                if(map[i][k]&&map[k][j])
                {
                      map[i][j]=1;
                      out[i]++;//出度
                      in[j]++;//入度
                }
            }
}
int main()
{
    int m,i,j;
    while(~scanf("%d%d",&n,&m))
    {
        memset(map,0,sizeof(map));
        memset(in,0,sizeof(in));
        memset(out,0,sizeof(out));
        while(m--)
        {
            scanf("%d%d",&i,&j);
            map[i][j]=1;
            out[i]++;
            in[j]++;
        }
        floyd();
        int ans=0;
        for(i=1;i<=n;i++)
            if(in[i]+out[i]==n-1)ans++;
        printf("%d\n",ans);
    }
    return 0;
}

  

posted @ 2012-04-16 21:15  快乐.  阅读(130)  评论(0编辑  收藏  举报