poj_2186: Popular Cows(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基础题)的更多相关文章
- POJ 2186:Popular Cows Tarjan模板题
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25945 Accepted: 10612 De ...
- POJ 2168 Popular cows [Tarjan 缩点]
...
- 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 ...
- poj 2186: Popular Cows(tarjan基础题)
题目链接 tarjan参考博客 题意:求在图上可以被所有点到达的点的数量. 首先通过tarjan缩点,将所有内部两两可达的子图缩为一点,新图即为一个有向无环图(即DAG). 在这个DAG上,若存在不止 ...
- POJ - 2186 Popular Cows tarjain模板题
http://poj.org/problem?id=2186 首先求出所有的强连通分量,分好块.然后对于每一个强连通分量,都标记下他们的出度.那么只有出度是0 的块才有可能是答案,为什么呢?因为既然你 ...
- [poj 2186]Popular Cows[Tarjan强连通分量]
题意: 有一群牛, a会认为b很帅, 且这种认为是传递的. 问有多少头牛被其他所有牛认为很帅~ 思路: 关键就是分析出缩点之后的有向树只能有一个叶子节点(出度为0). 做法就是Tarjan之后缩点统计 ...
- POJ 2186 Popular Cows tarjan缩点算法
题意:给出一个有向图代表牛和牛喜欢的关系,且喜欢关系具有传递性,求出能被所有牛喜欢的牛的总数(除了它自己以外的牛,或者它很自恋). 思路:这个的难处在于这是一个有环的图,对此我们可以使用tarjan算 ...
- USACO 2003 Fall Orange Popular Cows /// tarjan缩点 oj22833
题目大意: n头牛,m个崇拜关系,并且崇拜具有传递性 如果a崇拜b,b崇拜c,则a崇拜c 求最后有几头牛被所有牛崇拜 强连通分量内任意两点都能互达 所以只要强联通分量内有一点是 那么其它点也都会是 按 ...
- POJ 3180 The cow Prom Tarjan基础题
题目用google翻译实在看不懂 其实题目意思如下 给一个有向图,求点个数大于1的强联通分量个数 #include<cstdio> #include<algorithm> #i ...
随机推荐
- 软件测试基础(软件测试分类和工具组)firebug、firepath的安装
白盒测试:需要了解内部结构和代码 黑盒测试:不关心内部结构和代码 灰盒测试:介于白盒黑盒之间 静态测试:测试时不执行被测试软件 动态测试:测试时执行被测试软件 单元测试:测试软件的单元模块 集成测试: ...
- 快来领取一场专门讲解UTF-8与UTF-16编码算法的GitChat活动的免费名额
微信扫一扫,可打开该GitChat活动页面 字符编码是计算机世界里最基础.最重要.最令人困惑的一个主题之一.不过,在计算机教材中却往往浮光掠影般地草草带过,甚至连一本专门进行深入介绍的专著都找不到(对 ...
- 如何用phpcms将静态网页生成动态网页?
在前两篇随笔中已经简单介绍了phpcms,那么现在让我们来看一下如何用phpcms将静态网页生成动态网页? 1.在templates文件夹下新建模板文件夹ceshi(名字可以自己随笔起) 2.在ces ...
- Scrapy中使用cookie免于验证登录和模拟登录
Scrapy中使用cookie免于验证登录和模拟登录 引言 python爬虫我认为最困难的问题一个是ip代理,另外一个就是模拟登录了,更操蛋的就是模拟登录了之后还有验证码,真的是不让人省心,不过既然有 ...
- mybatis if test 解决页面 升序和降序的问题
<if test="status !=null and status !='' and status =='1'.toString()"> ORDER BY tag.c ...
- IE11中navigator.userAgent的变化
在原来判断浏览器是否是ie时,我们可以根据navigator.userAgent中时候有MSIE,但是IE11进行变革,userAgent中不在包含MSIE字段, 在实际项目中,入到类似的在控制台报错 ...
- linux下swoole的安装
//官方推荐的安装方式1:下载压缩包 wget https://github.com/swoole/swoole-src/archive/swoole-1.8.4-stable.zip 2:解压缩 u ...
- php索引数组转成关联数组
foreach($revenue_data as $k3=>$v3){ $temps[$v3['_id']['date']]= array( '_id'=>$v3['_id'], 'tot ...
- JAVA上传与下载
java下载指定地址的文件 package com.test; import java.io.FileNotFoundException; import java.io.FileOutputStrea ...
- C语言精要总结-指针系列(二)
此文为指针系列第二篇: C语言精要总结-指针系列(一) C语言精要总结-指针系列(二) 指针运算 前面提到过指针的解引用运算,除此之外,指针还能进行部分算数运算.关系运算 指针能进行的有意义的算术运算 ...