题意:有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. c#符号含义

    属性:(带手型图标)方法:(紫红色菱形)事件:(闪电)字段:(蓝色菱形) 还有很多,具体图标不好描述命名空间,类,接口,值类,枚举,清单或类信息项等

  2. Altium Designer 2017 ActiveRoute使用以及其他技巧

    ActiveRoute 点击右下角PCB->PCB ActiveRoute调出ActiveRoute面板 在设计电路时,有一堆细小的白色线,表示几个脚之间需要连接,按住键盘Alt + 鼠标左键, ...

  3. Java-Class-Miniprogram:com.common.utils.miniprogram.Auth

    ylbtech-Java-Class-miniprogram:com.common.utils.miniprogram.Auth 1.返回顶部 1.1. package com.ylbtech.com ...

  4. Day 13 进程和线程

    进程和线程 今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持“多任务”的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务 ...

  5. Scrapy爬虫框架示意图汇总

  6. 关于read和fread

    1.fread与read的区别---open和fopen的区别--fread函数和fwrite函数:http://blog.csdn.net/dreamtdp/article/details/7560 ...

  7. 如何应对SHA-1加密算法升级为SHA-256

    经过权威机构证实,sha1加密算法的不安全性越来越高,sha指纹造假成本越来越低,随即微软.谷歌等IT巨头相继发布弃用sha1加密算法声明,第三方认证机构自2016年1月1日起,将全面停止签发SHA1 ...

  8. BUPT2017 springtraining(16) #2 ——基础数据结构

    题目在这里 A.似乎是个并查集+??? B.10W的范围,似乎可以暴力来一发二分+sort? 但我猜正解可以O(nlogn)? C.单调队列入门题目 #include <cstdio> ] ...

  9. broker监控dataguard配置

    使用broker查看dataguard信息时有告警 DGMGRL> show configuration; Configuration - DRTEST Protection Mode: Max ...

  10. iOS学习笔记18-CoreData你懂的

    一.CoreData介绍 CoreData是iOS5之后新出来的的一个框架, 是对SQLite进行一层封装升级后的一种数据持久化方式. 它提供了对象<-->关系映射的功能,即能够将OC对象 ...