zoukankan      html  css  js  c++  java
  • 洛谷P2341 [HAOI2006]受欢迎的牛|【模板】强连通分量

    https://www.luogu.org/problem/P2341

    缩点之后唯一 一个出度为0的点

    #include<cstdio>
    #include<iostream>
    
    using namespace std;
    
    #define N 10001
    #define M 50001
    
    int front[N],nxt[M],to[M],tot;
    
    int dfn[N],low[N],st[N],top,bl[N],siz[N];
    bool vis[N];
    
    int out[N];
    
    void read(int &x)
    {
        x=0; char c=getchar();
        while(!isdigit(c)) c=getchar();
        while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }
    }
    
    void add(int u,int v)
    {
        to[++tot]=v; nxt[tot]=front[u]; front[u]=tot;
    }
    
    void tarjan(int x)
    {
        dfn[x]=low[x]=++tot;
        vis[x]=true;
        st[++top]=x;
        int t;
        for(int i=front[x];i;i=nxt[i])
        {
            t=to[i];
            if(!dfn[t]) 
            {
                tarjan(t);
                low[x]=min(low[x],low[t]); 
            }
            else if(vis[t]) low[x]=min(low[x],dfn[t]);
        } 
        if(dfn[x]==low[x])
        {
            while(st[top]!=x)
            {
                bl[st[top]]=x;
                vis[st[top--]]=false;
                siz[x]++;
            }
            bl[st[top]]=x;
            vis[st[top--]]=false;
            siz[x]++;
        }
    }
    
    int main()
    {
        int n,m;
        read(n); read(m);
        int u,v;
        while(m--)
        {
            read(u); read(v);
            add(u,v);
        }
        tot=0;
        for(int i=1;i<=n;++i)
            if(!dfn[i]) tarjan(i);
        for(int i=1;i<=n;++i)
            for(int j=front[i];j;j=nxt[j])
                if(bl[i]!=bl[to[j]]) out[bl[i]]++;
        int sum=0,ans;
        for(int i=1;i<=n;++i)
            if(bl[i]==i && !out[i]) sum++,ans=siz[i];
        if(sum!=1) printf("0");
        else printf("%d",ans);
    }

    题目描述

    每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶

    牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果A喜

    欢B,B喜欢C,那么A也喜欢C。牛栏里共有N 头奶牛,给定一些奶牛之间的爱慕关系,请你

    算出有多少头奶牛可以当明星。

    输入格式

     第一行:两个用空格分开的整数:N和M

     第二行到第M + 1行:每行两个用空格分开的整数:A和B,表示A喜欢B

    输出格式

     第一行:单独一个整数,表示明星奶牛的数量

    输入输出样例

    输入 #1
    3 3
    1 2
    2 1
    2 3
    输出 #1
    1

    说明/提示

    只有 3 号奶牛可以做明星

    【数据范围】

    10%的数据N<=20, M<=50

    30%的数据N<=1000,M<=20000

    70%的数据N<=5000,M<=50000

    100%的数据N<=10000,M<=50000

  • 相关阅读:
    Java map双括号初始化方式的问题
    Koa 中间件的执行
    JavaScript 实现页面中录音功能
    Koa 中实现 chunked 数据传输
    WebAssembly 上手
    TypeScript `infer` 关键字
    Vim 插件的安装
    MySQL EXPLAIN 语句
    面向切面编程(AOP)
    CSS 类名的问题
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/11797753.html
Copyright © 2011-2022 走看看