题目链接:http://poj.org/problem?id=2186

题目大意:

   每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这
种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头
牛被所有的牛认为是受欢迎的。
解题思路:
假设有两头牛A和B都被其他所有牛认为是红人,那么显然,A被B认为是红人,B也被A认为是红人,即存在一个包含A、B两个顶点的圈,或者说,A、B同属于一个强联通分量。所以
如果有一头牛被其他所有牛认为是红人,那么其所属的强联通分量内的所有牛都被其他所有牛认为是红人。我们把图进行强联通分量分解后,至多有一个强联通分量满足题目的条件。
做法: 先用tarjan求出每个强连通分量,再缩点,统计每个点的出度,如果有且只有1个出度为0的点,就输出这个点包含的节点数,否则输出0。
代码
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
const int N=1e4+; int cnt,num;
int dfn[N],low[N],fa[N],sze[N],outdeg[N];
stack<int>sk;
vector<int>v[N]; void tarjan(int u){
dfn[u]=low[u]=++cnt;
sk.push(u);
for(int i=;i<v[u].size();i++){
int t=v[u][i];
if(!dfn[t]){ //点t未被访问
tarjan(t);
low[u]=min(low[u],low[t]);
}
else if(!fa[t]) low[u]=min(low[u],dfn[t]); //点t已被访问,且t还在栈中
}
if(low[u]==dfn[u]){
num++;
while(){
int t=sk.top();
sk.pop();
fa[t]=num; //缩点操作,将这些点都归为点num
sze[num]++;
if(t==u) break;
}
}
} int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
v[a].push_back(b);
}
for(int i=;i<=n;i++){
if(!dfn[i]) tarjan(i);
}
for(int i=;i<=n;i++){
for(int j=;j<v[i].size();j++){
int t=v[i][j];
if(fa[t]!=fa[i]) outdeg[fa[i]]++;
}
}
//缩点后,出度为0的点只能有一个,否则不符合条件输出0
int ans=;
for(int i=;i<=num;i++){
if(!outdeg[i]){
if(ans>){
puts("");
return ;
}
ans=sze[i];
}
}
printf("%d\n",ans);
return ;
}
 
 

POJ 2186 Popular Cows(强联通分量)的更多相关文章

  1. POJ 2186 Popular Cows (强联通)

    id=2186">http://poj.org/problem? id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 655 ...

  2. poj 2186 Popular Cows 【强连通分量Tarjan算法 + 树问题】

    题目地址:http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Sub ...

  3. POJ 2186 Popular Cows(强连通分量Kosaraju)

    http://poj.org/problem?id=2186 题意: 一个有向图,求出点的个数(任意点可达). 思路: Kosaraju算法的第一次dfs是后序遍历,而第二次遍历时遍历它的反向图,从标 ...

  4. POJ 2186 Popular Cows(强连通分量)

    [题目链接] http://poj.org/problem?id=2186 [题目大意] 给出一张有向图,问能被所有点到达的点的数量 [题解] 我们发现能成为答案的,只有拓扑序最后的SCC中的所有点, ...

  5. poj 2186 "Popular Cows"(强连通分量入门题)

    传送门 参考资料: [1]:挑战程序设计竞赛 题意: 每头牛都想成为牛群中的红人. 给定N头牛的牛群和M个有序对(A, B),(A, B)表示牛A认为牛B是红人: 该关系具有传递性,所以如果牛A认为牛 ...

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

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

  7. 强连通分量分解 Kosaraju算法 (poj 2186 Popular Cows)

    poj 2186 Popular Cows 题意: 有N头牛, 给出M对关系, 如(1,2)代表1欢迎2, 关系是单向的且能够传递, 即1欢迎2不代表2欢迎1, 可是假设2也欢迎3那么1也欢迎3. 求 ...

  8. POJ 2186 Popular cows(Kosaraju+强联通分量模板)

    题目链接:http://poj.org/problem?id=2186 题目大意:给定N头牛和M个有序对(A,B),(A,B)表示A牛认为B牛是红人,该关系具有传递性,如果牛A认为牛B是红人,牛B认为 ...

  9. POJ 2186 Popular Cows(强联通+缩点)

    Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= ...

随机推荐

  1. UML类图与类间六种关系表示

    UML类图与类间六种关系表示 1.类与类图 类封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性,操作,关系的对象集合的总称. 类图是使用频率最高的UML图之一. 类图用于描述系统中所包含的 ...

  2. OneProxy实现mysql读写分离

    OneProxy for MySQL可以复用不同应用到后端数据库的连接,有效降低数据库的并发连接数:可以即时踢除不可用的节点,将应用请求转发到其他可用节点,保证业务服务的稳定性. 可透明地将查询语句分 ...

  3. redis 新开端口号

    2012 ps aux | grep redis 2013 cd /usr/local/redis/ 2014 ls 2015 cd etc/ 2016 ls 2017 cp redis.conf r ...

  4. tp5.1 高级查询之 表里2字段比较大小

    $map = [ 'status' => 1, 'is_show' => 1,]; $result = Db::name('coupon') ->where($map) ->w ...

  5. P2776 [SDOI2007]小组队列

    P2776 [SDOI2007]小组队列 题目背景 嘛,这道非常简单的给大家提供信心的省选题洛谷居然没有! 这么简单的题怎么可以没有! 给大家提升士气是义不容辞的责任! 所以我就来补一下啦.. 值得一 ...

  6. socket利用多线程实现一对多通信

    1.服务器端:socket()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接.将accept()写入死循环,每次连接一个客户端,开一个线程. 2.一般情况下建立s ...

  7. SQL优化:

    今日给人查找数据,时间关系,写个比较粗暴的SQL语句:   #2s587ms#直接将所有表关联,比较粗暴 select go.businessId,dd.dict_namefrom fn_xte.gt ...

  8. 路径名导致的异常:javax.imageio.IIOException: Can't read input file!

    背景: 写了一个测试程序,目的是读取本地的图片,为其打上水印图片.在使用过程中总会遇到:javax.imageio.IIOException: Can't read input file!的错误,最开 ...

  9. python字符中加入变量

    有时候,我们需要在字符串中加入相应的变量,以下提供了几种字符串加入变量的方法: 1.+ 连字符 name = 'zhangsan' print('my name is '+name) #结果为 my  ...

  10. MySQL数据库应用 从入门到精通 学习笔记

    以下内容是学习<MySQL数据库应用 从入门到精通>过程中总结的一些内容提要,供以后自己复现使用. 一:数据库查看所有数据库: SHOW DATABASES创建数据库: CREATE DA ...