bzoj1612 Usaco08 Jan 牛大赛

水题模拟

建一个图,每两个牛进行比赛就连一条边,然后两遍dfs求出比他弱和比他强的牛,最后如果相加数量等于n,说明他能与全部的牛进行比较,排名确定。

#include<bits/stdc++.h>
using namespace std;
int mp1[110][110],mp2[110][110];
int n,m,ans;
int f1[110],f2[110];
bool vis[110];
void dfs1(int x){
    f1[x]++;vis[x]=1;
    for(int i=1;i<=n;i++){
        if(!mp1[x][i]||vis[i])continue;
        dfs1(i);
    }
}
void dfs2(int x){
    f2[x]++;vis[x]=1;
    for(int i=1;i<=n;i++){
        if(!mp2[x][i]||vis[i])continue;
        dfs2(i);
    }
}
int main(){
    scanf("%d%d",&n,&m);
    int u,v;
    for(int i=1;i<=m;i++){
        scanf("%d%d",&u,&v);
        mp1[u][v]=1;mp2[v][u]=1;
    }
    for(int i=1;i<=n;i++){
        dfs1(i);
        memset(vis,0,sizeof vis);
    }
    for(int i=1;i<=n;i++){
        dfs2(i);
        memset(vis,0,sizeof vis);
    }
    for(int i=1;i<=n;i++)if(f1[i]+f2[i]-1==n)ans++;
    printf("%d",ans);
    return 0;
} 

 

posted @ 2017-09-28 21:11  Elfish?  阅读(181)  评论(0编辑  收藏  举报