luogu p2149 [USACO08JAN]牛大赛Cow Contest

原题链接:https://www.luogu.org/problem/show?pid=2419

 

这个题看一眼数据范围,100,嗯。。。。。。n^3做法,想了想会的算法,Floyd(太弱不会别的算法)。

luogu的题解,很多人直接写了考虑边权的Floyd,而这道题,我们只需要考虑两点之间能否到达就可以了,也就是说e其实可以开成bool数组。

与Floyd一样,枚举中间点与两个点,如果i能到达k,k能到达j,那么i也能到达j。

然后遍历e数组,检查各点能到达的点的数目,如果为n-1(自己不算),那么该点就能确定了。

非边权的写法优点:无需预处理填充无限大值,无需考虑大小问题。但是只适用于只考虑能否到达的问题。

 

#include<cstdio>
int e[105][105],s[105],n,m,x,y,ans;
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d",&x,&y);
        e[x][y]=1;
    }
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(e[i][k]&&e[k][j]) e[i][j]=1;
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if (e[i][j])
            {
                s[i]++;
                s[j]++;
            }
        }
    }
    for(int i=1;i<=n;i++) if(s[i]==n-1) ans++;
    printf("%d",ans);
    return 0;
}

 

posted @ 2017-09-19 17:14  Excim  阅读(268)  评论(0编辑  收藏  举报