题意:

有n头奶牛,然后有个规则是A->B,B->C,那么A->C;

A觉得B受欢迎,B觉得C受欢迎,那么A觉得C受欢迎;

求:被其他所有牛都欢迎的牛的数量;

思路:

原来的思路:

我们只要在缩点之后的图中,找出出度为0的点,然后输出它里面的点就可以了。【虽然AC了】

然后我觉得这样不是会有缺陷么?他可能入度也为0呢?也就是缩点后那个出度为0点是独立的。所以还是要判断入度吧。

后来其实没必要入度,我们继续查看其他出度为0的点,如果存在的话那肯定是有独立的部分,然后如果没有的话,嘿嘿,那么肯定就是他了。

总结:

利用tarjan算法可以办到缩点。

然后主要的思路就是:在一张图里面,经过缩点后,出度为0的点只有一个的话,那么他肯定被其他点在一定程度上给盯上了。

—————————————歌:飞得更高–汪峰

//#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const double eps=1e-6;
const double pi=acos(-1.0);
const int mod=998244353;
const int INF=0x3f3f3f3f; const int N=1e4+8; struct asd{
int to;
int next;
};
asd q[N*5];
int head[N*5],tol; int n;
int dfn[N];
int low[N];
int st[N],vis[N],in[N];
int p,tp,sum;
int kr[N];
int xx[N]; void INIT()
{
tol=0;
memset(head,-1,sizeof(head));
}
void add(int a,int b)
{
q[tol].to=b;
q[tol].next=head[a];
head[a]=tol++;
} void tarjan(int u)
{
dfn[u]=low[u]=++p;
st[++tp]=u;
vis[u]=1;
for(int i=head[u];i!=-1;i=q[i].next)
{
int x=q[i].to;
if(!dfn[x]){
tarjan(x);
low[u]=min(low[u],low[x]);
}
else if(vis[x]){
low[u]=min(low[u],dfn[x]);
}
}
if(dfn[u]==low[u]){
int temp;
sum++;
while(1){
temp=st[tp];
in[temp]=sum;
vis[temp]=0;
tp--;
if(temp==u){
break;
}
}
}
} void solve()
{
memset(kr,0,sizeof(kr));
memset(xx,0,sizeof(xx));
for(int i=1;i<=n;i++){
for(int v=head[i];v!=-1;v=q[v].next){
int t=q[v].to;
if(in[t]!=in[i]){
kr[in[i]]++;
}
}
}
int ans=0,num=0,k;
for(int i=1;i<=sum;i++){
if(!kr[i]){
num+=1;
k=i;
}
}
if(num==1){
for(int i=1;i<=n;i++)
{
if(in[i]==k){
ans++;
}
}
printf("%d\n",ans);
}
else{
puts("0");
}
} int main()
{
int a,b,m;
scanf("%d%d",&n,&m);
INIT();
while(m--){
scanf("%d%d",&a,&b);
add(a,b);
}
tp=p=sum=0;
memset(vis,0,sizeof(vis));
memset(low,0,sizeof(low));
for(int i=1;i<=n;i++)
{
if(!dfn[i]){
tarjan(i);
}
}
solve();
return 0;
}

poj2186【利用强连通分量】的更多相关文章

  1. POJ2186(强连通分量分解)

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 35035   Accepted: 14278 De ...

  2. POJ2186 (强连通分量缩点后出度为0的分量内点个数)

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27820   Accepted: 11208 De ...

  3. 强连通分量tarjan缩点——POJ2186 Popular Cows

    这里的Tarjan是基于DFS,用于求有向图的强联通分量. 运用了一个点dfn时间戳和low的关系巧妙地判断出一个强联通分量,从而实现一次DFS即可求出所有的强联通分量. §有向图中, u可达v不一定 ...

  4. 强连通分量+poj2186

    强连通分量:两个点能够互相连通. 算法分解:第一步.正向dfs全部顶点,并后序遍历 第二步,将边反向,从最大边dfs,构成强连通分量 标号最大的节点属于DAG头部,cmp存一个强连通分量的拓扑序. p ...

  5. POJ2186 Popular Cows(强连通分量)

    题目问一个有向图所有点都能达到的点有几个. 先把图的强连通分量缩点,形成一个DAG,那么DAG“尾巴”(出度0的点)所表示的强连通分量就是解,因为前面的部分都能到达尾巴,但如果有多个尾巴那解就是0了, ...

  6. POJ2186 Popular Cows 强连通分量tarjan

    做这题主要是为了学习一下tarjan的强连通分量,因为包括桥,双连通分量,强连通分量很多的求法其实都可以源于tarjan的这种方法,通过一个low,pre数组求出来. 题意:给你许多的A->B ...

  7. POJ2186 Popular Cows 【强连通分量】+【Kosaraju】+【Tarjan】+【Garbow】

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 23445   Accepted: 9605 Des ...

  8. POJ2186 强连通分量+缩点

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 40234   Accepted: 16388 De ...

  9. POJ2186 Popular Cows 题解 强连通分量入门题

    题目链接:http://poj.org/problem?id=2186 题目大意: 每头牛都想成为牛群中的红人. 给定N头牛的牛群和M个有序对(A, B),(A, B)表示牛A认为牛B是红人: 该关系 ...

随机推荐

  1. HDU2897( 巴什博奕变形)

    邂逅明下 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  2. 《python源代码剖析》笔记 Python的编译结果

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.python的运行过程 1)对python源码进行编译.产生字节码 2)将编译结果交给p ...

  3. C++学习总结3

    链接上一篇日志,C++学习总结2,下面介绍下C++里面的其他内容 虚函数:一个接口,多种方法. 多态:编译时的多态与运行时的多态. 编译时的多态表现为运算符的重载与函数的重载. 运行时的多态表现为使用 ...

  4. 服务器----1U、2U、3U、4U

    U是一种表示服务器外部尺寸的单位,是unit的缩略语,详细的尺寸由作为业界团体的美国电子工业协会(EIA)所决定. 之所以要规定服务器的尺寸,是为了使服务器保持适当的尺寸以便放在铁质或铝质的机架上.机 ...

  5. 读书笔记-2java虚拟机的可达性算法与finalize方法

    JAVA通过可达性分析算法来确定堆中哪些对象是应该被回收的. 非常多人包含我曾经在不了解的时候总以为是通过引用计数器来推断某个对象是否应该被回收可是后来想了想包含查阅一些资料发现不是这种.由于假设採用 ...

  6. Python开发【第6节】【文件操作】

    1.基本文件操作 open() 打开或者创建一个文件 格式:open('文件路径','打开模式') 返回值:文件io对象 打开模式一共N种: w模式 写模式write 文件不存在时会创建文件,如果文件 ...

  7. LeetCode题解(20)--Valid Parentheses

    https://leetcode.com/problems/valid-parentheses/ 原题: Given a string containing just the characters ' ...

  8. 使用JavaScript获取浏览器Chrome版本信息

    Navigator对象包含了有关浏览器的信息 可通过访问其属性appVersion或userAgent来获取浏览器Chrome版本 例如,我所使用的QQ浏览器的appVersion和userAgent ...

  9. java -jar 与nohup的区别

    ——作为java程序员,经常会遇到这样一个问题,打个jar包,测试或者上线生产,于是乎面临的选择来了,java –jar or nohup? 下面我来扒一扒: 一.    java -jar a.ja ...

  10. 20170228 METHOD handle_data_changed-

    CALL METHOD er_data_changed->add_protocol_entry   METHOD handle_data_changed. DATA: ls_modi TYPE  ...