poj3360

来源:互联网 发布:淘宝上古着店推荐 编辑:程序博客网 时间:2024/06/06 07:41

题意:有N头奶牛在比赛,给出一系列条件,形如A战胜了B。若A战胜B,B战胜C,则我们认为A也能战胜C。问,根据这一系列条件,有多少牛的排名是可以确定的?

分析:对于每头牛,我们只要算出有多少奶牛直接或间接指向了它,它直接或间接指向了多少头奶牛,把两个值加起来,等于N-1,则合法。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

#define to e[i].v
#define inf 123456789
#define rep(i,a,b) for (int i=a;i<=b;++i)
#define N 105

int f[N][N],n,m,in[N],out[N],as;

int max(int A,int B) {return A>B? A:B;}
int min(int A,int B) {return A>B? B:A;}
int read()
{
    int x=0,f=1;char ch=getchar();
    for (;ch>'9'||ch<'0';ch=getchar()) if (ch=='-') f=-1;
    for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
    return x*f;
}



int main()
{
    n=read();m=read();
    rep(i,1,n) f[i][i]=1;
    rep(i,1,m)
    {
        int u,v;u=read();v=read();f[u][v]=1;
    }
    rep(k,1,n) rep(i,1,n) rep(j,1,n) if ((i^k)&&(k^j)) if (f[i][k]&&f[k][j]) f[i][j]=1;
    rep(i,1,n) rep(j,1,n) if (i^j) if (f[i][j]) out[i]++,in[j]++;
    rep(i,1,n) if (out[i]+in[i]+1==n) as++;
    printf("%d",as);
    return 0;
}

0 0
原创粉丝点击