POJ 2186 Tarjan
题意:有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的更多相关文章
- poj 2186 tarjan求强连通分量
蕾姐讲过的例题..玩了两天后才想起来做 貌似省赛之后确实变得好懒了...再努力两天就可以去北京玩了! 顺便借这个题记录一下求强连通分量的算法 1 只需要一次dfs 依靠stack来实现的tarjan算 ...
- POJ 2186 tarjan+缩点 基础题
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 37111 Accepted: 15124 De ...
- poj 2186(tarjan+缩点)
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 37083 Accepted: 15104 De ...
- 【POJ 2186】Popular Cows
http://poj.org/problem?id=2186 tarjan求强连通分量. 因为SD省选用WinXP+Cena评测而且不开栈,所以dfs只好写手动栈了. 写手动栈时思路清晰一点应该是不会 ...
- poj 2186 强连通分量
poj 2186 强连通分量 传送门 Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 33414 Acc ...
- 强连通分量分解 Kosaraju算法 (poj 2186 Popular Cows)
poj 2186 Popular Cows 题意: 有N头牛, 给出M对关系, 如(1,2)代表1欢迎2, 关系是单向的且能够传递, 即1欢迎2不代表2欢迎1, 可是假设2也欢迎3那么1也欢迎3. 求 ...
- POJ 2186 Popular Cows(Tarjan)
http://poj.org/problem?id=2186 题意 :给你n头牛,m对关系,每对关系由两个编号组成,u和v代表着u认为v是受欢迎的,如果1认为2是受欢迎的,2认为3是受欢迎的,那1认为 ...
- poj 2186 Popular Cows :求能被有多少点是能被所有点到达的点 tarjan O(E)
/** problem: http://poj.org/problem?id=2186 当出度为0的点(可能是缩点后的点)只有一个时就存在被所有牛崇拜的牛 因为如果存在有两个及以上出度为0的点的话,他 ...
- poj 2186 Popular Cows 【强连通分量Tarjan算法 + 树问题】
题目地址:http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Sub ...
随机推荐
- ESLint =》tslint.json
结论:将ESLint提示注意()里面的规则属性在tslint.json中"rules": { } 里设置为false 1.ES6: ESLint提示"Require Ob ...
- 怎么用最短时间高效而踏实地学习Python?
之所以写这篇文章,在标题里已经表达得很清楚了.做技术的人都知道,时间就是金钱不是一句空话,同一个技术,你比别人早学会半年,那你就能比别人多拿半年的钱.所以有时候别人去培训我也不怎么拦着,为什么?因为培 ...
- js 输入框只能输入 1-7 的数字
$jq(function () { $jq("#XSCM_WORKDAY").keyup(function () { //如果输入非数字,则替换为'',如果输入数字,则在每4位之后 ...
- Books Queries (codeforces 1066C)
模拟题 开一个容器进行模拟即可,注意容器设置初始大小不然容易re.设置两个指针l,r.把容器当作桶,每一个桶都有一个编号表示位置,左边进入那么就是编号为l,右边一样.然后l--或者r++,l=r=0的 ...
- 关于MySQL中自增的理解和设置
show create table t10;--查看表的创建结果 show create table t10\G;--竖列查看 --设置自增为20 ); insert into t2(name) va ...
- C#学习笔记_10_设计模式&继承&多态
10_设计模式&继承&多态 设计模式 由前人总结的用来解决特定问题的解决方案 单例模式 在一个项目的不同模块中获取对象,获取到的是同一个对象 代码 继承 概念:如果多个类中具有相同的字 ...
- PAT 1111 Online Map
Input our current position and a destination, an online map can recommend several paths. Now your jo ...
- seleniumd对象的操作方法,属性,keys
这是通过find方法找到的页面元素,此对象提供了多种方法,让我们可以与页面元素进行交互,例如点击.清空. 目录: 1. 方法 2. 属性 3. keys 方法 clear()清空 如果当前元素中有文本 ...
- 中国省市区地址三级联动插件---jQuery Distpicker
插件描述:distpicker是一款可以实现中国省市区地址三级联动jQuery插件.它使用简单,简单设置即可完成中国省市区地址联动效果. [官网]https://fengyuanchen.github ...
- detecting locked tables mysql (locked by LOCK TABLE)
detecting locked tables mysql (locked by LOCK TABLE) up vote15down votefavorite 7 I would like to kn ...