题目链接:传送门

思路:

多少头牛收到所有牛头牛的喜欢,喜欢具有传递性,所以将互相喜欢的牛视为一个点,就是有向图的

缩点,收到所有牛的喜欢要求这个“点”没有出度,所以缩点之后统计所有没有出度的点就是结果,如果有多头牛没有出度,

就说明图不连通,答案为0。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. const int maxn = ;
  6. int num[maxn],low[maxn],vis[maxn],head[maxn],ver[maxn],next[maxn],tot;
  7. int st[maxn],out[maxn],fa[maxn],top,tim,col;
  8. int MIN(int x,int y)
  9. {
  10. return x<y?x:y;
  11. }
  12. int MAX(int x,int y)
  13. {
  14. return x>y?x:y;
  15. }
  16. void Init()
  17. {
  18. memset(vis,,sizeof(vis));
  19. memset(low,,sizeof(low));
  20. memset(num,,sizeof(num));
  21. memset(head,,sizeof(head));
  22. memset(ver,,sizeof(ver));
  23. memset(next,,sizeof(next));
  24. memset(st,,sizeof(st));
  25. memset(out,,sizeof(out));
  26. memset(fa,,sizeof(fa));
  27. top=;tim=;tot=;col=;
  28. }
  29. void addedge(int u,int v)
  30. {
  31. ver[++tot]=v;next[tot]=head[u];head[u]=tot;
  32. }
  33. void Tarjan(int u) //强连通模板
  34. {
  35. low[u]=num[u]=++tim;
  36. vis[u]=;
  37. st[++top]=u;
  38. for(int i=head[u];i;i=next[i]){
  39. int v=ver[i];
  40. if(!vis[v]){
  41. Tarjan(v);
  42. low[u]=MIN(low[u],low[v]);
  43. }
  44. else if(!fa[v]) low[u]=MIN(low[u],num[v]);
  45. }
  46. if(low[u]==num[u]){
  47. fa[u]=++col;
  48. while(st[top]!=u){
  49. fa[st[top]]=col;
  50. top--;
  51. }
  52. top--;
  53. }
  54. }
  55. int main(void)
  56. {
  57. int n,m,i,j,x,y;
  58. while(~scanf("%d%d",&n,&m)){
  59. Init();
  60. for(i=;i<=m;i++){
  61. scanf("%d%d",&x,&y);
  62. addedge(x,y);
  63. }
  64. for(i=;i<=n;i++)
  65. if(!vis[i]) Tarjan(i);
  66.  
  67. for(i=;i<=n;i++){
  68. for(j=head[i];j;j=next[j]){
  69. if(fa[i]!=fa[ver[j]]) out[fa[i]]++; //统计缩点后每个点的出度
  70. }
  71. }
  72. x=;
  73. int cnt=,sum=;
  74. for(i=;i<=col;i++)
  75. if(out[i]==) cnt++,x=i;
  76. if(cnt==){ //当且仅当只有一个“点”时才有结果
  77. for(i=;i<=n;i++) //统计这个缩点中的点数
  78. if(fa[i]==x) sum++;
  79. printf("%d\n",sum);
  80. }
  81. else printf("0\n");
  82. }
  83. return ;
  84. }

LOJ-10091(强连通分量)的更多相关文章

  1. Tarjan求强连通分量 缩点

    强连通分量的定义: 在一张有向图中,如果两个点u,v之间能相互到达则称这两个点u,v是强连通的,在这个基础上如果有向图G中的任意两个顶点都强连通,那么称图G是一个强连通图.有向非强连通图的极大强连通子 ...

  2. 【题解】新型城市化 HAOI2017 网络流 二分图最大匹配 强连通分量

    Prelude 好,HAOI2017终于会做一道题了! 传送到洛谷:→_→ 传送到LOJ:←_← 本篇博客链接:(●'◡'●) Solution 首先要读懂题. 考场上我是这样想的QAQ. 我们把每个 ...

  3. HDU5934 强连通分量

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5934 根据距离关系建边 对于强连通分量来说,只需引爆话费最小的炸弹即可引爆整个强连通分量 将所有的强连通分 ...

  4. POJ1236Network of Schools[强连通分量|缩点]

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16571   Accepted: 65 ...

  5. 有向图的强连通分量的求解算法Tarjan

    Tarjan算法 Tarjan算法是基于dfs算法,每一个强连通分量为搜索树中的一颗子树.搜索时,把当前搜索树中的未处理的结点加入一个栈中,回溯时可以判断栈顶到栈中的结点是不是在同一个强连通分量中.当 ...

  6. Tarjan算法--强连通分量

    tarjan的过程就是dfs过程. 图一般能画成树,树的边有三种类型,树枝边 + 横叉边(两点没有父子关系) + 后向边(两点之间有父子关系): 可以看到只有后向边能构成环,即只有第三张图是强连通分量 ...

  7. 强连通分量的一二三 | | JZOJ【P1232】 | | 我也不知道我写的什么

    贴题: 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间之 ...

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

    有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G ...

  9. poj2186Popular Cows(Kosaraju算法--有向图的强连通分量的分解)

    /* 题目大意:有N个cows, M个关系 a->b 表示 a认为b popular:如果还有b->c, 那么就会有a->c 问最终有多少个cows被其他所有cows认为是popul ...

  10. Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)【转】【修改】

    一.基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成 ...

随机推荐

  1. python学习Day12 函数的默认值、三元表达式、函数对象(函数名)的应用场景、名称空间与作用域

    复习 1.字符串的比较: -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 2. 函数的参数 : 1)实参与形参:       -- 形参:在函数定义时()中出现的参数       ...

  2. uni-app 使用 iconfont

    使用 uni-app 做项目时需要用到 iconfont.和 web 使用略有差别.谨以此记录. 因为 uni-app 不能使用本地字体图标库,所以不能直接下载使用. 1.将iconfont中需要的图 ...

  3. jmiter性能测试

    1. Jmeter简介Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件.相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测 ...

  4. Apache Flink 分布式运行时环境

    Tasks and Operator Chains(任务及操作链) 在分布式环境下,Flink将操作的子任务链在一起组成一个任务,每一个任务在一个线程中执行.将操作链在一起是一个不错的优化:它减少了线 ...

  5. checkbox、radio控件和文字不对齐

    一般使用html控件的时候  单选按钮和复选框的控件和文字不对齐 给input控件加上   style="vertical-align: middle; margin-top: -2px; ...

  6. H5(ionic2+VScode) 环境安装

    一:node.js.npm.cnpm.cordova环境安装 介绍下概念 node.js 非阻塞异步的Ajax 操作基础框架. npm 国外的node.js 包管理器 cnpm 国内淘宝的node.j ...

  7. aop point-cut表达式

    好多博客写的云里雾里,大多都有一点毛病.大家还是以官网为准 @官网文档 官网截图 modifiers-pattern:修饰符 ret-type-pattern:方法返回类型 declaring-typ ...

  8. Java多线程01(Thread类、线程创建、线程池)

    Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...

  9. 12条MySQL优化技巧

    应用程序慢,原因多多,可能是网络的原因.可能是系统架构的原因,还有可能是数据库的原因. 有人会说性能调优是数据库管理员(DBA)的事,然而性能调优跟程序员们也有莫大的关系. 程序中嵌入的一行行的SQL ...

  10. laravel的路由分组,中间件,命名空间,子域名,路由前缀

    laravel的路由分组,就是把一些具有相同特征的路由进行分组,比如一些路由需要进行验证,一些路由有共同的前缀,一些路由有相同的控制器命名空间等. 这样把路由组合在一起,方便管理,维护性更好. Rou ...