POJ3660 Cow Contest

来源:互联网 发布:淘宝卖家怎么设置会员 编辑:程序博客网 时间:2024/04/30 11:51

又见比赛。

其实有是一个floyd传递闭包。

很简单的原理,把击败与被击败的关系floyd处理一遍过去以后。

如果可以确定关系的则是mat[i][j]||mat[j][i]==true。

#include<iostream>

using namespace std;
const int N=105;
//const int P=10005;
bool mat[N][N];
int n,m;
void floyd()
{
     for(int k=1;k<=n;k++)
             for(int i=1;i<=n;i++)
                     for(int j=1;j<=n;j++)
                     {
                             if(mat[i][k]&&mat[k][j])
                             mat[i][j]=true;
                             }
 }
int main()
{
    //freopen("C:\\Users\\wuyanyisb\\Desktop\\1.txt","r",stdin);
    scanf("%d%d",&n,&m);
    int a,b;
    for(int i=1;i<=m;i++)
    {
            scanf("%d%d",&a,&b);
            mat[a][b]=true;
    }
    floyd();
    int ans=0;
    for(int i=1;i<=n;i++)
    {
            //int tmp=0;
            bool flag=false;
            for(int j=1;j<=n;j++)
            {
                    if(j!=i)
                    {
                            if(!(mat[i][j]||mat[j][i]))
                            {
                                  
                                  flag=true;
                                  break;
                            }
                    }
            }
            if(flag)
                    ans++;
    }
    printf("%d\n",n-ans);
    return 0;
}