关闭

BZOJ 1051 [HAOI2006]受欢迎的牛

标签: BZOJ-1051
102人阅读 评论(0) 收藏 举报
分类:

缩点

对于一个强连通分量,里面的所有点都是等效的,任意一个点被欢迎等价于全部被欢迎,任意一个去欢迎等价于全部去欢迎,于是把他们缩起来。

缩完得到一棵树,只需判断出度为零点是否唯一即可

#include<cstdio>
#include<algorithm>
#define N 10005
#define M 50005
using namespace std;
struct edge{int next,to;}e[M];
int ecnt=0, last[N], cnt=0, dfn[N], low[N], sta[N], top=0, times=0, belong[N], siz[N];
bool out[N];
void add(int a, int b)
{
    e[++ecnt]=(edge){last[a],b};
    last[a]=ecnt;
}
void tarjan(int x)
{
    sta[++top]=x;
    dfn[x]=low[x]=++times;
    for(int i = last[x]; i; i=e[i].next)
    {
        int y=e[i].to;
        if(dfn[y])low[x]=min(low[x],dfn[y]);
        else{tarjan(y);low[x]=min(low[x],low[y]);}
    }
    if(dfn[x]==low[x])
    {
        ++cnt;
        siz[cnt]=1;
        while(sta[top]!=x)
        {
            belong[sta[top--]]=cnt;
            siz[cnt]++;
        }
        belong[sta[top--]]=cnt;
    }
}
int main()
{
    int n, m;
    scanf("%d%d",&n,&m);
    for(int i = 1, a, b; i <= m; i++)
    {
        scanf("%d%d",&a,&b);
        add(a,b);
    }
    for(int i = 1; i <= n; i++)
        if(!dfn[i])
            tarjan(i);
    for(int x = 1; x <= n; x++)
        for(int i = last[x]; i; i=e[i].next)
        {
            int y=e[i].to;
            if(belong[x]!=belong[y])
                out[belong[x]]=1;
        }
    int ans=0;
    for(int i = 1; i <= cnt; i++)
        if(!out[i])
        {
            if(ans)return !printf("0\n");
            ans=siz[i];
        }
    printf("%d\n",ans);
    return 0;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

【bzoj 1051】[HAOI2006]受欢迎的牛

[HAOI2006]受欢迎的牛Time Limit: 10 Sec Memory Limit: 162 MB Submit: 5255 Solved: 2787 [Submit][Status...
  • yyx2000
  • yyx2000
  • 2017-04-05 16:08
  • 88

[BZOJ]1051: [HAOI2006]受欢迎的牛 强连通

Description   每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎...
  • baidu_36797646
  • baidu_36797646
  • 2016-12-07 13:42
  • 312

【连通分量】BZOJ 1051:[HAOI2006]受欢迎的牛

BZOJ 1051:[HAOI2006]受欢迎的牛Description每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这种关系是具有传递性的,...
  • Doom_bringer
  • Doom_bringer
  • 2016-02-02 22:05
  • 242

BZOJ 1051, 受欢迎的牛

求可以被除自己以外所有点遍历到的点的个数。 首先强连通分量跑一遍,缩点之后统计每个强连通分量(可以视为一个点)的出度。如果有多个出度大于0,则无解;否则输出唯一出度为0的强连通分量内点的个数。
  • u010576722
  • u010576722
  • 2016-10-30 15:59
  • 73

【BZOJ 1051】 受欢迎的牛 【Tarjan】

Description   每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎...
  • qq_33583069
  • qq_33583069
  • 2016-10-16 20:35
  • 137

【tarjan】BZOJ 1051:受欢迎的牛

1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3134  Solved: 1642[Submit][St...
  • Doom_bringer
  • Doom_bringer
  • 2015-12-30 10:01
  • 159

【图论】[BZOJ 1051]受欢迎的牛

题目问的是有多少个牛收到所有的牛的喜欢,因为这道题目具有传递性,所以在有向图上找出强连通子图,可以发现每个子图中的奶牛一定是互相喜欢的,所以不用考虑这样的情况(把每一个强连通子图找出,缩点)然后整个图...
  • JeremyGJY
  • JeremyGJY
  • 2015-07-24 10:20
  • 448

【bzoj 1051】[HAOI2006]受欢迎的牛(Tarjan缩点)

采漫天霞云,持一束流光,为你铺一世红妆
  • reverie_mjp
  • reverie_mjp
  • 2016-06-18 10:22
  • 460

[BZOJ 1051][HAOI2006]受欢迎的牛(强连通分量、缩点)

Description  每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛...
  • zars19
  • zars19
  • 2017-02-13 22:27
  • 74

bzoj 1051 HAOI2006 受欢迎的牛 强联通分量+拓扑排序

bzoj 1051 受欢迎的牛 点击打开链接 Description 每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这种关...
  • DJS_K_D
  • DJS_K_D
  • 2014-12-27 21:56
  • 349
    个人资料
    • 访问:62701次
    • 积分:3604
    • 等级:
    • 排名:第10553名
    • 原创:308篇
    • 转载:0篇
    • 译文:0篇
    • 评论:24条
    公告
    欢迎您 !
    由于博主是一个蒟蒻,
    如有错误之处还望指出!
    o( =•ω•= )o
    神犇们的博客
    文章分类