题意:有n(n<=10000)头牛,每头牛都想成为最受欢迎的牛,给出m(m<=50000)个关系,如(1,2)代表1欢迎2,关系可以传递,但是不是相互的,那么就是说1欢迎2不代表2欢迎1,但是如果2欢迎3那么1也欢迎3.

输入第一行为n,m第2到1+m行为m个欢迎关系,求被所有牛都欢迎的牛的数量。

思路:Tarjan求强联通分量做。

1.如果图不联通,直接输出零。(不解释)

2.如果有超过1个出度=0的点,直接输出零。因为它肯定不是最受欢迎的牛。

3.如果只有一个出度等于零的点,那它的强联通分量里的所有点都是最受欢迎的牛。

题目在这里

#include <stack>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int low[10005],dfn[10005],n,m,cnt=0,t=0,p[10005],out[10005],ans=0;
bool vis[10005];
stack<int>stk;
vector<int>v[10005];
void tarjan(int x)
{
low[x]=dfn[x]=++cnt,vis[x]=1,stk.push(x);
for(int i=0;i<v[x].size();i++)
if(!dfn[v[x][i]])
tarjan(v[x][i]),low[x]=min(low[v[x][i]],low[x]);
else if(vis[v[x][i]])
low[x]=min(low[x],dfn[v[x][i]]);
if(dfn[x]==low[x]){
int y;t++;
do y=stk.top(),stk.pop(),vis[y]=0,p[y]=t;while(y!=x);
}
}
int main()
{
register int x,y,q;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d",&x,&y),v[x].push_back(y);
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
for(int i=1;i<=n;i++)
for(int j=0;j<v[i].size();j++)
if(p[v[i][j]]!=p[i])out[p[i]]++;
for(int i=1;i<=t;i++)
if(!out[i])ans++,q=i;
if(ans==1){
for(int i=1;i<=n;i++)if(p[i]==q)ans++;
printf("%d",ans-1);
}
else puts("0");
}

// by Sirius_Ren
#include <stack>
#include <cstdio>
#define f(X) for(int i=1;i<=X;i++)
using namespace std;
stack<int>s;
int xx,yy,n,m,tot=1,cnt=1,t=0,first[10005],next[50005],v[50005],low[10005],dfn[10005],p[10005],vis[10005],out[10005];
void add(int x,int y){v[tot]=y;next[tot]=first[x];first[x]=tot++;}
void tarjan(int x){
dfn[x]=low[x]=cnt++,vis[x]=1,s.push(x);
for(int i=first[x];i;i=next[i])
if(!dfn[v[i]])tarjan(v[i]),low[x]=min(low[v[i]],low[x]);
else if(vis[v[i]])low[x]=min(dfn[v[i]],low[x]);
if(low[x]==dfn[x]){t++;do xx=s.top(),s.pop(),vis[xx]=0,p[xx]=t;while(xx!=x);}
}
int main(){
scanf("%d%d",&n,&m);
f(m)scanf("%d%d",&xx,&yy),add(xx,yy);
f(n)if(!dfn[i])tarjan(i);
f(n)for(int j=first[i];j;j=next[j])if(p[v[j]]!=p[i])out[p[i]]++;
yy=-1;
f(t)if(!out[i])yy++,xx=i;
if(!yy){f(n)if(p[i]==xx)yy++;printf("%d\n",yy);}
else puts("0");
}

第二遍

POJ 2186 Tarjan的更多相关文章

  1. poj 2186 tarjan求强连通分量

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

  2. POJ 2186 tarjan+缩点 基础题

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 37111   Accepted: 15124 De ...

  3. poj 2186(tarjan+缩点)

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 37083   Accepted: 15104 De ...

  4. 【POJ 2186】Popular Cows

    http://poj.org/problem?id=2186 tarjan求强连通分量. 因为SD省选用WinXP+Cena评测而且不开栈,所以dfs只好写手动栈了. 写手动栈时思路清晰一点应该是不会 ...

  5. poj 2186 强连通分量

    poj 2186 强连通分量 传送门 Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 33414 Acc ...

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

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

  7. POJ 2186 Popular Cows(Tarjan)

    http://poj.org/problem?id=2186 题意 :给你n头牛,m对关系,每对关系由两个编号组成,u和v代表着u认为v是受欢迎的,如果1认为2是受欢迎的,2认为3是受欢迎的,那1认为 ...

  8. poj 2186 Popular Cows :求能被有多少点是能被所有点到达的点 tarjan O(E)

    /** problem: http://poj.org/problem?id=2186 当出度为0的点(可能是缩点后的点)只有一个时就存在被所有牛崇拜的牛 因为如果存在有两个及以上出度为0的点的话,他 ...

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

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

随机推荐

  1. 文件上传原理--FileReader

    单个文件:<div> <input value="上传" type="file" id="photos_upload"&g ...

  2. css3 animation 中的 steps

    steps Specifies a stepping function, described above, taking two parameters. The first parameter spe ...

  3. 集成学习_Bagging 和随机森林(rf)

       集成学习方式总共有3种:bagging-(RF).boosting-(GBDT/Adaboost/XGBOOST).stacking      下面将对Bagging 进行介绍:(如下图所示) ...

  4. TCP/IP UDP 协议首部及数据进入协议栈封装的过程

    数据的封装 UDP 封装 TCP 封装 IP 封装 检验和算法 当应用程序用TCP传送数据时,数据被传送入协议栈中,然后逐一通过每一层直到被当作一串比特流送入网络 注: UDP数据TCP数据基本一致. ...

  5. Spring整合Junit框架进行单元测试Demo

    一.开发环境 eclipse版本:4.6.1 maven版本:3.3.3 junit版本:4.12 spring版本:4.1.5.RELEASE JDK版本:1.8.0_111 二.项目结构 图 三. ...

  6. sql 语句实现可用户名、邮箱、手机号登录系统

    select top 1 nid from Users where (userName collate Chinese_PRC_CS_AS=@userName or mobile collate Ch ...

  7. JavaScript初步学习----基本使用,简单事件,修改样式,数据类型

    JavaScript基本使用 JavaScript原名叫livescript,是一门动态类型,弱类型基于原型的脚本语言   用于页面特效,前后交替,后台开发(node)   JavaScript写在s ...

  8. 清北学堂模拟赛d4t5 b

    分析:一眼树形dp题,就是不会写QAQ.树形dp嘛,定义状态肯定有一维是以i为根的子树,其实这道题只需要这一维就可以了.设f[i]为以i为根的子树中的权值和.先处理子树内部的情况,用一个数组son[i ...

  9. nyoj_366_D的小L_201403011600

    D的小L 时间限制:4000 ms  |  内存限制:65535 KB 难度:2   描述       一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给 ...

  10. C. Vladik and Memorable Trip DP

    C. Vladik and Memorable Trip time limit per test 2 seconds memory limit per test 256 megabytes input ...