题目链接

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. 【Web开发】Mean web开发 01-Express实现MVC模式开发

    简介 Mean是JavaScript的全栈开发框架.更多介绍 用Express实现MVC模式开发是Mean Web全栈开发中的一部分. Express 是一个基于 Node.js 平台的极简.灵活的 ...

  2. java小白进阶安卓第一天

  3. c++字符串的输入的思考

    字符串的输入,是学习c++的一个重点,也是一个极富有细节意味的知识点,如果你不了解这些细节,你可能会在写程序时犯错而一脸懵逼不知所措. 与此同时,我们要了解c++缓冲区的概念,程序的输入都建有一个缓冲 ...

  4. [0] WCF开发下,提示HTTP 无法注册 URL 进程不具有此命名空间的访问权限

    Visual Studio以管理员的身份运行就可以了.

  5. JavaScript练习笔记整理·2 - 6.24

      Codewars地址:https://www.codewars.com/ 欢迎和大家一起来讨论~   基础练习(1):   我的解答为: function isIsogram(str){ if(s ...

  6. OpenCV学习2-----使用inpaint函数进行图像修复

    安装opencv时,在opencv的安装路径下, sources\samples\cpp\  路径里面提供了好多经典的例子,很值得学习. 这次的例子是利用inpaint函数进行图像修复. CV_EXP ...

  7. Example007关闭窗口时关闭父窗口

    <!--实例007关闭窗口时刷新父窗口--> <!DOCTYPE html> <html lang="en"> <head> < ...

  8. H5学习第三周

    今天主要总结弹性布局 flex使用 1.给父容器添加display flex/inline-flex;属性 2.父容器可以使用的属性值有 >>>flex-direction 属性决定 ...

  9. Javacript 学习笔记

    一.初探 javacript 学习无法是围绕着对象和属性两个方面来兜圈子,万变不离其宗. 在js中,能点出来的,或者中括号里面的必然是属性(方法).数组除外. 对象调用属性! 对象调用属性! 对象调用 ...

  10. 构建混合应用方式之WCF中继

    使用VPN或者ER服务建立云服务和本地服务网络通道来搭建混合应用的方式,需要网络设备的配合和比较复杂的网络配置,所以不是特别的方便.如果是不希望对本地网络环境做修改,而只是服务层面的混合,那么可以使用 ...