[BZOJ1612]奶牛的比赛 传递闭包

来源:互联网 发布:华为网络机顶盒哪款好 编辑:程序博客网 时间:2024/06/06 15:46

考虑一个点的排名能被确定,当且仅当不存在另一个点与它互相不能到达。跑一边传递闭包,判断每个点是否满足上述条件即可。
代码:

#include<iostream>#include<cstdio>using namespace std;int n,m,ans=0;bool f[110][110];int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++)    {        int x,y;        scanf("%d%d",&x,&y);        f[x][y]=1;    }    for(int k=1;k<=n;k++)        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)                f[i][j]=f[i][j]||(f[i][k]&&f[k][j]);    for(int i=1;i<=n;i++)    {        bool pd=1;        for(int j=1;j<=n;j++)            if(i!=j&&(!f[i][j])&&(!f[j][i])) {pd=0;break;}        ans+=pd;        }    printf("%d",ans);    return 0;}