题目链接

tarjan参考博客

本文代码参考博客

题意:求在图上可以被所有点到达的点的数量。

首先通过tarjan缩点,将所有内部两两可达的子图缩为一点,新图即为一个有向无环图(即DAG)。

在这个DAG上,若存在不止一个所有点均可到达的点,则所有点不满足题目要求。若存在一个,则该点所代表的连通分量的点数即为答案。

//DAG(有向无环图)上面至少存在一个出度为0的点,否则必然可以成环。

#include<cstdio>
#include<cstring>
#include<stack>
#include<vector>
using namespace std;
typedef long long LL;

;
int n,m;
int idd;            //用来给点标记所属连通分量
int cnt[N];            //cnt[idd]表示编号为idd的连通分量的大小
int id[N];            //记录所属的连通分量
int now,dfn[N];        //表示搜索次序
int low[N];            //记录强连通分量子树的根节点的搜索次序
int d[N];            //d[i]==0时表示,编号为i的连通分量不认为任何其他分量popular
int vis[N],instack[N];
vector<int> adj[N];
stack<int> st;

void init()
{
    idd=;
    memset(vis,,sizeof(vis));
    memset(d,,sizeof(d));
    ; i<=n; i++)
        adj[i].clear();
    while(!st.empty())
        st.pop();
    now=;    //now 表示 tarjan次序
}

void tarjan(int u)
{
    dfn[u]=low[u]=now++;    //标记被访问时间
    vis[u]=instack[u]=;
    st.push(u);
    ; i<adj[u].size(); i++)
    {
        int x=adj[u][i];    //x表示下一个
        if(!vis[x])
        {
            tarjan(x);
            low[u]=min(low[u],low[x]);
        }
        else if(instack[x])
            low[u]=min(low[u],dfn[x]);    //注意两个min的区别
    }
    if(dfn[u]==low[u])    //u结点为根节点
    {
        ,res=;
        while(!st.empty()&&nowp!=u)
        {
            nowp=st.top(),st.pop();
            instack[nowp]=;
            id[nowp]=idd;
            res++;
        }
        cnt[idd++]=res;    //将连通分量的点数记录下来
    }
}

int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        init();
        ; i<m; i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            adj[v].push_back(u);
        }
        ; i<=n; i++)    //强连通分量缩点
            if(!vis[i]) tarjan(i);
        ; i<=n; i++)
            ; j<adj[i].size(); j++)
                if(id[i]!=id[adj[i][j]]) d[id[adj[i][j]]]++;
        ;
        ; i<idd; i++)
            if(!d[i]) res++;
        )
            ; i<idd; i++)
            {
                )
                {
                    printf("%d\n",cnt[i]);
                    break;
                }
            }
        else
            puts(");
    }
}

poj_2186: Popular Cows(tarjan基础题)的更多相关文章

  1. POJ 2186:Popular Cows Tarjan模板题

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25945   Accepted: 10612 De ...

  2. POJ 2168 Popular cows [Tarjan 缩点]

                                                                                                         ...

  3. poj 2186 Popular Cows tarjan

    Popular Cows Description Every cow's dream is to become the most popular cow in the herd. In a herd ...

  4. poj 2186: Popular Cows(tarjan基础题)

    题目链接 tarjan参考博客 题意:求在图上可以被所有点到达的点的数量. 首先通过tarjan缩点,将所有内部两两可达的子图缩为一点,新图即为一个有向无环图(即DAG). 在这个DAG上,若存在不止 ...

  5. POJ - 2186  Popular Cows tarjain模板题

    http://poj.org/problem?id=2186 首先求出所有的强连通分量,分好块.然后对于每一个强连通分量,都标记下他们的出度.那么只有出度是0 的块才有可能是答案,为什么呢?因为既然你 ...

  6. [poj 2186]Popular Cows[Tarjan强连通分量]

    题意: 有一群牛, a会认为b很帅, 且这种认为是传递的. 问有多少头牛被其他所有牛认为很帅~ 思路: 关键就是分析出缩点之后的有向树只能有一个叶子节点(出度为0). 做法就是Tarjan之后缩点统计 ...

  7. POJ 2186 Popular Cows tarjan缩点算法

    题意:给出一个有向图代表牛和牛喜欢的关系,且喜欢关系具有传递性,求出能被所有牛喜欢的牛的总数(除了它自己以外的牛,或者它很自恋). 思路:这个的难处在于这是一个有环的图,对此我们可以使用tarjan算 ...

  8. USACO 2003 Fall Orange Popular Cows /// tarjan缩点 oj22833

    题目大意: n头牛,m个崇拜关系,并且崇拜具有传递性 如果a崇拜b,b崇拜c,则a崇拜c 求最后有几头牛被所有牛崇拜 强连通分量内任意两点都能互达 所以只要强联通分量内有一点是 那么其它点也都会是 按 ...

  9. POJ 3180 The cow Prom Tarjan基础题

    题目用google翻译实在看不懂 其实题目意思如下 给一个有向图,求点个数大于1的强联通分量个数 #include<cstdio> #include<algorithm> #i ...

随机推荐

  1. 用Python玩微信(非常详细)

    代码放在这里:wzyonggege/python-wechat-itchat 词云那里可以换成小黄人图片 ----------------------------------------------- ...

  2. Web前端的路该怎么走?很迷茫

    “路漫漫其修远兮,吾将上下而求索”,这句出自<离骚>. 虽然端午已过,但是还是不影响一个程序员想表(zhuang)达(boy)自己此刻心情的冲动. 偶然路过同事旁边,不(tou)小(kan ...

  3. Azure经典门户创建VM,如何设置使用静态IP地址?

    使用 Azure 经典管理门户中创建的虚拟机,无法使用静态IP 地址,在管理界面没有该设置.在新的管理门户中虽然有使用静态IP的设置,但是选项是灰色,无法修改,提示错误:This virtual ma ...

  4. Webpack 开发工具与模块热替换

    Webpack 开发工具与模块热替换 ​⚠️ 注意: 永远不要在生产环境中使用这些工具,永远不要. devtool 当 JavaScript 异常抛出时,你常会想知道这个错误发生在哪个文件的哪一行.然 ...

  5. Bash提示符

    Bash有四种提示符 1.基本提示符(PS1):即$符号,是默认的基本提示符,当Shell运行在交互模式下时,该提示符会出现在屏幕上,可以设置为其它符号. 显示PS1设置[cb@cb:16:36:23 ...

  6. fdisk 非交互式创建 分区

    一. key 非交互式创建分区, 与 交互式创建分区区别不大. 使用 fdisk 的默认选项, 使用空行即可, 不用回车. 创建 主分区 和 扩展分区时, 需要注意 分区号 二. 创建主分区 fdis ...

  7. Akka(8): 分布式运算:Remoting-远程查找式

    Akka是一种消息驱动运算模式,它实现跨JVM程序运算的方式是通过能跨JVM的消息系统来调动分布在不同JVM上ActorSystem中的Actor进行运算,前题是Akka的地址系统可以支持跨JVM定位 ...

  8. 数据处理包dplyr的函数

    dplyr专注处理dataframe对象, 并提供更稳健的与其它数据库对象间的接口. 一.5个关键的数据处理函数: select()   返回列的子集filter()     返回行的子集arrang ...

  9. 使用zabbix_agent监控第一台windows服务器

    解压windows客户端压缩包 bin目录下会有win32和win64俩个文件夹,根据windows系统的版本自行进行选择,将客户端程序文件拷贝至C:\zabbix 将conf文件中的zabbix_a ...

  10. word2-寻找社交新浪微博中的目标用户

    项目简述: 为了进行更加精准的营销, 利用数据挖掘相关算法, 利用开放API或自行编写爬虫获得新浪微博, 知乎等社交网络(可能需要破解验证码)中用户所发布的数据, 利用数据挖掘的相关算法进行分析, 从 ...