题意:有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. animation与transition区别

    transition: 过渡属性 过渡所需要时间 过渡动画函数 过渡延迟时间:默认值分别为:all 0 ease 0 1.局限性: 1)只能设置一个属性 2)需要伪类/事件触发才执行 3)只能设置动画 ...

  2. VM虚拟机NAT链接外网

    1.vi /etc/sysconfig/networkNETWORKING=yesHOSTNAME=localhost.localdomainGATEWAY=192.168.110.2 2.vi /e ...

  3. 常见的Xshell运行命令

    最近接触到了Xshell这个软件,使用这个软件我们来进行连接Linux系统,进去之后我们可能会两眼一抹黑,小编就带大家来学些常见的shell命令. 首先我们要跟大家从最简单的聊起,我们进入Xshell ...

  4. c# 图片资料

  5. 入口文件 index.php

    一. 运行流程 The index.php serves as the front controller, initializing the base resources needed to run ...

  6. HDU1465 不容易系列之一&&HDU4535吉哥系列故事——礼尚往来

    HDU1465不容易系列之一 Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加 ...

  7. [Luogu] P4198 楼房重建

    题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个 ...

  8. Huawei-R&S-网络工程师实验笔记20190527-华为设备密码重置、设置web管理

    >Huawei-R&S-网络工程师实验笔记20190527-华为设备密码重置.设置web管理 >>实验开始(使用SecureCRT 等工具软件): 一.华为设备密码重置,通过 ...

  9. GlobalSign 多域型(SNAs) SSL 证书

    GlobalSign 多域型(SNAs) SSL 证书 GlobalSign 多域型(SNAs) SSL 证书,有别于通配符 SSL 证书可以同时保护一个域名下所有的子域名网站,SANs 证书更进一步 ...

  10. hdu 4081 最小生成树变形

    /*关于最小生成树的等效边,就是讲两个相同的集合连接在一起 先建立一个任意最小生成树,这条边分开的两个子树的节点最大的一个和为A,sum为最小生成树的权值和,B为sum-当前边的权值 不断枚举最小生成 ...