强连通分量:1309. [HAOI2006]受欢迎的牛

★★   输入文件:cow.in   输出文件:cow.out   简单对比
时间限制:1 s   内存限制:128 MB

【题目描述】

每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛 A 认为牛

B受欢迎。这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头牛被所有的牛认为是受欢迎的。

【输入格式】

第1行两个整数N,M;

   接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复,即有可能出现多个A,B)

【输出格式】

一个数,即有多少头牛被所有的牛认为是受欢迎的。

【样例输入】

3 3
1 2
2 1
2 3

【样例输出】

1

【数据范围】

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

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

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

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

 /*判断能不能有“牛被所有的牛认为是受欢迎”,那就是缩点之后的图中出度为0的点只有一个,如果图中出度为0的点有多个,肯定不符合情况,找出该点之后,再输出该强连通分量即可*/
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<stack>
#define N 10010
#define M 50010
bool in_stack[N];
int low[N],dfn[N],x,y,n,m,father[N];
int chudu[N],t=,topt=,head[N];
struct Edge{
int v,last,u;
}edge[M*];
stack<int>sta;
int ans[N],begi,en;
int read()
{
int sum=,ff=;
char s;
s=getchar();
while(s<''||s>'')
{
if(s=='-') ff=-;
s=getchar();
}
while(s>=''&&s<='')
{
sum=sum*+s-'';
s=getchar();
}
return sum*ff;
}
void add_edge(int u,int v,int k)
{
edge[k].u=u;
edge[k].v=v;
edge[k].last=head[u];
head[u]=k;
}
void input()
{
n=read();m=read();
for(int i=;i<=m;++i)
{
x=read();y=read();
add_edge(x,y,i);
}
}
void tarjan(int u)
{
low[u]=dfn[u]=++topt;
sta.push(u);
in_stack[u]=true;
for(int l=head[u];l;l=edge[l].last)
{
int v=edge[l].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(in_stack[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
ans[++ans[]]=u;
int x;
do
{
x=sta.top();
sta.pop();
in_stack[x]=false;
father[x]=u;
}while(x!=u);
}
}
void suo_dian()
{
for(int l=;l<=m;++l)
{
if(father[edge[l].v]!=father[edge[l].u])
{
chudu[father[edge[l].u]]++;
}
}
}
int main()
{
freopen("cow.in","r",stdin);
freopen("cow.out","w",stdout);
input();
for(int i=;i<=n;++i)
{
if(!dfn[i])
{
tarjan(i);
}
}
suo_dian();
int sum=,l;
for(int i=;i<=ans[];++i)
if(chudu[ans[i]]==)
{
sum++;
l=ans[i];
}
if(sum>) printf("");
else if(sum==)
{
sum=;
for(int i=;i<=n;++i)
if(father[i]==l)
sum++;
printf("%d\n",sum);
}
fclose(stdin);fclose(stdout);
return ;
}

tarjan算法+缩点:求强连通分量 POJ 2186的更多相关文章

  1. [强连通分量] POJ 2186 Popular Cows

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31815   Accepted: 12927 De ...

  2. Tarjan算法打包总结(求强连通分量、割点和Tarjan-LCA)

    目录 Tarjan打包总结(求强连通分量.割点和Tarjan-LCA) 强连通分量&缩点 原理 伪代码 板子(C++) 割点 原理 伪代码 最近公共祖先(LCA) 原理 伪代码 板子 Tarj ...

  3. Tarjan求强连通分量,缩点,割点

    Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...

  4. poj 2186 tarjan求强连通分量

    蕾姐讲过的例题..玩了两天后才想起来做 貌似省赛之后确实变得好懒了...再努力两天就可以去北京玩了! 顺便借这个题记录一下求强连通分量的算法 1 只需要一次dfs 依靠stack来实现的tarjan算 ...

  5. tarjan求强连通分量+缩点+割点以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  6. tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  7. HDU 1827 Summer Holiday(tarjan求强连通分量+缩点构成新图+统计入度+一点贪心思)经典缩点入门题

    Summer Holiday Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  8. tarjan算法-解决有向图中求强连通分量的利器

    小引 看到这个名词-tarjan,大家首先想到的肯定是又是一个以外国人名字命名的算法.说实话真的是很佩服那些算法大牛们,佩服得简直是五体投地啊.今天就遇到一道与求解有向图中强连通分量的问题,我的思路就 ...

  9. Tarjan 算法求 LCA / Tarjan 算法求强连通分量

    [时光蒸汽喵带你做专题]最近公共祖先 LCA (Lowest Common Ancestors)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili tarjan LCA - YouTube Tarj ...

随机推荐

  1. Oracle 更新表(另一张表)

    Update a set(a.province,a.city)= (select province,city from b where b.mobile=a.mobile)

  2. java对象实例化

    JAVA类,只要知道了类名(全名)就可以创建其实例对象,通用的方法是直接使用该类提供的构造方法,如 NewObject o = new NewObject(); NewObject o = new N ...

  3. 一个支持实时预览的在线 Markdown 编辑器 - Markdoc

    最近组内需要为一些项目和系统写文档,发表在公司内的文档平台上,这个平台并不支持markdown,所以打算做一个在线markdown编辑器,支持实时预览,并且可以很容易的迁移发表到公司文档平台上,所以就 ...

  4. HttpURLConnection访问url的工具类

    java代码: import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; ...

  5. Swift学习之道

    Swift是苹果公司2014年推出的,用来撰写OSX和iOS应用程序的 2014年在Apple WWDC发布 可以与OC互相调用. Swift的特点:让应用开发简单,更加稳定,但是和OC的语法不是一般 ...

  6. Transaction rolled back because it has been marked as rollback-only 原因 和解决方案

    产生原因  , 1 serviceA 调用 serviceB 然后 B  抛出异常 ,B 所在的 事物 回滚,B 把当前可写 事物标记成 只读事物 , 2 如果 A 和B 是在 同一个事物环境,并且 ...

  7. 异常Exception分类

    1:编译时被检测异常:只要有是Exception和其子类都是,除了特殊子类RuntimeException体系.       这种问题已但出现,希望在编译时进行检测,让这种问题有对应处理方式      ...

  8. 解题:NOI 2018 归程

    题面 清新友好的题目 跑一个最短路,然后对海拔建Kruskal重构树,从最后接上去的边(最低的一个)开始DFS一下处理子树里路程的最小值. 询问是每次在重构树上倍增找到深度最浅的海拔高于当天水位线的节 ...

  9. 为自定义的View添加长按事件

    以前开发画板组件时,要添加一个长按监听事件,这个画板实际上就是继承自View的一个自定义组件. 首先,设置好长按事件发生时要触发的操作: private class LongPressRunnable ...

  10. HDU 4597 Play Game(区间DP(记忆化搜索))

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4597 题目大意: 有两行卡片,每个卡片都有各自的权值. 两个人轮流取卡片,每次只能从任一行的左端或右端 ...