题意:
有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;
}

转载于:https://www.cnblogs.com/keyboarder-zsq/p/5934428.html

poj2186【利用强连通分量】相关推荐

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

    题目大概意思为有 N 头牛,有些牛认为有些牛是红人,该关系具有传递性,例如果牛A觉得牛B是红人,牛B认为牛C是红人,则牛A也会认为牛C是红人,求被其他所有牛认为是红人的牛的总数 假设被其他所有牛认为是 ...

  2. 【C++】强连通分量

    强连通分量 先来一题例题 题目大意 怎么做? 分析 结论 不要高兴得太早 怎么办呢? 定义 缩点法 原图构建新图 发现 新的结论 强连通分量算法 Kosaraju算法 Tarjan算法 例题:信息传递 ...

  3. 图论——强连通分量(Tarjan算法)

    文章目录 强连通分量 利用Tarjan算法求强连通分量 来一道例题练手(USACO08DEC) 图论文章汇总 强连通分量 什么是强连通图? 如果一个有向图中,存在一条回路,所有的结点至少被经过一次,这 ...

  4. 强连通分量——tarjan算法缩点

    一. 什么是强连通分量? 强连通分量:在有向图G中,如果两个顶点u,v间(u->v)有一条从u到v的有向路径,同时还有一条从v到u的有向路径,则称两个顶点强连通(strongly connect ...

  5. poj2186(强连通分量)

    思路:找出出度为0 的顶点,如果出度为0的顶点大于1,则解为零,否则解就是出度为零的顶点的连通分支数. 刚开始是没有理解这道题的,也是看了大神之后才理解的. 方法一: #include<iost ...

  6. POJ2186——并查集+Tarjan算法求强连通分量

    算法讨论:这题陷阱比较多.首先,被所有牛欢迎,这说明所有的牛都要在一个连通图中,也就是将所给的边看成无向边的时候,所有点要在一个连通图中.这个我们用并查集来实现就可以了.强连通分量的求法就很简单了,正 ...

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

    题目连接: http://poj.org/problem?id=2186 题目大意: 每头奶牛都希望自己成为最欢迎的那头牛.给你N头牛,M个崇拜关系(A,B).意思是牛A 崇拜牛B.特别是,如果牛A崇 ...

  8. 有向图的强连通分量——Tarjan

    在同一个DFS树中分离不同的强连通分量SCC; 考虑一个强连通分量C,设第一个被发现的点是 x,希望在 x 访问完时立刻输出 C,这样就可以实现 在同一个DFS树中分离不同的强连通分量了. 问题就转换 ...

  9. 有向图——强连通分量

    有向图的强连通分量(strongly connected components) 在有向图G中,如果两个顶点vi,vj间(vi!=vj)有一条从vi到vj的路径,同时还有一条从vj到vi的路径(顶点相 ...

最新文章

  1. 强大的 IDEA 代码生成
  2. Linux:网络编程
  3. Python回调函数
  4. android 如何监听应用前后台切换
  5. .Net Core 2.2升级3.1的避坑指南
  6. 电脑没网络设备dns服务器没检测到响应,设备或资源dns没检测到有响应 网络无法连接...
  7. leetcode -- Clone Graph
  8. thrift java长连接_利用thrift在c++、java和python之间相互调用
  9. HDU-2553-N皇后问题
  10. 编程开发之--java多线程学习总结(4)
  11. No matching configuration of project :libusb was found.
  12. 电脑右下角图标不显示
  13. 保存Windows10随机聚焦锁屏壁纸
  14. java中类变量和实例变量
  15. 几个大学生实用的网站推荐
  16. Gmail和Orkut邀请自助发送[共享]
  17. 顾险峰:技术爆炸的亲历观察
  18. python中getattr()和setattr()的使用
  19. 能编程的游戏,你还等什么?
  20. 零拷贝技术( DMA、PageCache)

热门文章

  1. Lesson 3.5 - Maya Commands: getAttr
  2. pythonunicode和str_python2 中 unicode 和 str 之间的转换及与python3 str 的区别
  3. 基于python+opencv的图像目标区域自动提取
  4. 使用Keras打造一个实时可用交通标志识别App
  5. 泄漏计算机网络安全法情节,第十一章网络安全法第十二章电子商务纠纷的法律解决详细分解.doc...
  6. qt 在qtextedit显示数组_QtWidget: 设置QTextEdit的各种颜色
  7. string会被回收吗_互联网大厂面试题:这些面试都会吗?就想要30k?
  8. python判断字符串里的字符_Python检测字符串中是否包含某字符集合中的字符
  9. GitLab5.3修改项目仓库名称后wiki不能访问
  10. 数码相机专业术语解答