题目链接

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. iOS项目评估报告

    1.整体项目无分层概念,结构混乱,代码耦合严重. 影响:后期扩展困难,维护困难. 解决方案:1.整体采用mvc模式. 2.在原来的基础再抽离出业务层 3.业务层按模块管理,合理分层分包. 4.做好共用 ...

  2. Coursera 机器学习笔记(二)

    主要为第三周课程内容:逻辑回归与正则化 逻辑回归(Logistic Regression) 一.逻辑回归模型引入 分类问题是指尝试预测的是结果是否属于某一个类. 维基百科的定义为:根据已知训练区提供的 ...

  3. vue-cli webpack在node环境下安装使用

    第一步,需要下载并安装node.js以及他的npm组件: 第二步,用node -v;npm -v来测试node.js以及npm是否安装成功(建议用GIT命令行工具,因为GIT是linux系统),如果显 ...

  4. jQuery Ajax使用FormData上传文件和其他数据,后端web.py获取

    参考博文: 通过jQuery Ajax使用FormData对象上传文件 方法一:使用<form>表单初始化FormData对象方式上传文件 前端(JQuery): <form enc ...

  5. java之内部类

    最近学了java,对内部类有一点拙见,现在分享一下 所谓内部类(nested classes),即:面向对象程序设计中,可以在一个类的内部定义另一个类. 内部类不是很好理解,但说白了其实也就是一个类中 ...

  6. git rebase -i命令修改commit历史

    [TOC] 修改commit历史的前提 修改历史的提交是可能有风险的,是否有风险取决于commit是否已经推送远程分支,未推送,无风险,如果已推送,就千万不要修改commit了. 修改commit历史 ...

  7. winfrom DataSet和实体类的相互转换

    最近做WInfrom项目,对表格和控件的数据绑定非常喜欢用实体类对象来解决,但是绑定以后 又怎么从控件中拿到实体类或者转换为datatable 或者dataset呢 经过在网上的搜索以及自己的改进 完 ...

  8. WKWebView 官方文档

    WKWebView 类 一个WKWebView对象可以显示交互式的web内容.就像一个应用程序的浏览器.你可以使用WKWebView类嵌入Web内容的应用程序.这样做,创造一个WKWebView对象, ...

  9. Akka(9): 分布式运算:Remoting-远程构建式

    上篇我们讨论了Akka-Remoting.我们说Akka-Remoting是一种点对点的通讯方式,能使两个不同JVM上Akka-ActorSystem上的两个Actor之间可以相互沟通.Akka-Re ...

  10. 纯CSS3美化单选按钮radio

    这种纯CSS3美化单选按钮radio的方法适用于以下情况: 1.可兼容IE9以上,需要兼容IE8的要写IE的hack把样式去掉 2.只支持单选按钮radio,因为单选按钮选中样式的圆圈可以用CSS做出 ...