4175 传递闭包

传递闭包
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
Problem Description

已知有n头牛,m次战斗关系,询问最终可以确定排名的牛的数量。
Input

多组测试数据,对于每组测试数据,第1行输入两个整数n(1 <= n <= 100)和m(0 <= m <= 4950),分别表示有n头牛和m次战斗关系,之后m行每行输入两个正整数x和y表示编号为x的牛可以战胜编号为y的牛,数据保证合法,询问可以确定排名的牛的数量。
Output

对于每组测试数据,输出整数ans,表示可以确定排名的牛的数量。
Sample Input

5 5
4 3
4 2
3 2
1 2
2 5
Sample Output

2
Hint

Source

xry-fhf

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int i,j,a[101][101];
void warshall(int n)
{
    int k;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(a[j][i]==1)
            {
                for(k=1;k<=n;k++)
                {
                    if(a[j][k]==1||a[i][k]==1)
                    {
                        a[j][k]=1;
                    }
                }
            }
        }
    }
}
int main()
{
    int n,m,x,y,f,ans;
    while(~scanf("%d%d",&n,&m))
    {
        memset(a,0,sizeof(a));
        ans=0;
        while(m--)
        {
            scanf("%d%d",&x,&y);
            a[x][y]=1;
        }
        warshall(n);
        for(i=1;i<=n;i++)
        {
            f=0;
            for(j=1;j<=n;j++)
            {
                if(i==j)
                {
                    if(a[i][j]==1)//主对角线上不为0
                    {
                        f=1;
                        break;
                    }
                }
                else if(!a[i][j])//非主对角线的如果为0,并且对称点也是0,不符合
                {
                    if(!a[j][i])
                    {
                        f=1;
                        break;
                    }
                }
            }
            if(f==0)
            {
                ans++;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/bhliuhan/article/details/80590510