1051: [HAOI2006]受欢迎的牛

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 4573  Solved: 2428
[Submit][Status][Discuss]

Description

  每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这
种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头
牛被所有的牛认为是受欢迎的。

Input

  第一行两个数N,M。 接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复,即有可
能出现多个A,B)

Output

  一个数,即有多少头牛被所有的牛认为是受欢迎的。

Sample Input

3 3
1 2
2 1
2 3

Sample Output

1

HINT

100%的数据N<=10000,M<=50000

题目链接:BZOJ 1051

做法:Tarjan缩点后,由于缩点后必定是一个DAG或者叫有向无环图,因此应该至少存在一个出度为0的缩点和一个入度为0的缩点,这题就是要统计出度为0的分量个数

若统计的数量有为1个,则说明全在一个连通分量内,即任意两点互相可达,所有牛都是受欢迎的;若大于1,则说明至少一个连通分量中的牛的数量少于n-1即欢迎不能直接或间接地全部集中在至少一头牛身上,就没有牛受欢迎了

代码:

  1. #include <stdio.h>
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #define INF 0x3f3f3f3f
  5. #define CLR(arr,val) memset(arr,val,sizeof(arr))
  6. #define LC(x) (x<<1)
  7. #define RC(x) ((x<<1)+1)
  8. #define MID(x,y) ((x+y)>>1)
  9. typedef pair<int,int> pii;
  10. typedef long long LL;
  11. const double PI=acos(-1.0);
  12. const int N=10010;
  13. const int M=50010;
  14.  
  15. struct edge
  16. {
  17. int to;
  18. int pre;
  19. };
  20. edge E[M];
  21. int head[N],tot;
  22. int dfn[N],low[N],st[N],belong[N],ins[N],sc,ts,top,scnum[N];
  23. int out[N];
  24.  
  25. void init()
  26. {
  27. CLR(head,-1);
  28. CLR(low,0);
  29. CLR(dfn,-1);
  30. CLR(belong,0);
  31. CLR(ins,0);
  32. sc=ts=top=0;
  33. CLR(scnum,0);
  34. CLR(out,0);
  35. }
  36. inline void add(int s,int t)
  37. {
  38. E[tot].to=t;
  39. E[tot].pre=head[s];
  40. head[s]=tot++;
  41. }
  42. void Tarjan(int u)
  43. {
  44. dfn[u]=low[u]=++ts;
  45. ins[u]=1;
  46. st[top++]=u;
  47. int v;
  48. for (int i=head[u]; ~i; i=E[i].pre)
  49. {
  50. v=E[i].to;
  51. if(dfn[v]==-1)
  52. {
  53. Tarjan(v);
  54. if(low[v]<low[u])
  55. low[u]=low[v];
  56. }
  57. else if(ins[v])
  58. {
  59. if(dfn[v]<low[u])
  60. low[u]=dfn[v];
  61. }
  62. }
  63. if(dfn[u]==low[u])
  64. {
  65. ++sc;
  66. do
  67. {
  68. v=st[--top];
  69. ins[v]=0;
  70. belong[v]=sc;
  71. ++scnum[belong[v]];
  72. }while (u!=v);
  73. }
  74. }
  75. int main(void)
  76. {
  77. int n,m,a,b,i,j,u,v;
  78. while (~scanf("%d%d",&n,&m))
  79. {
  80. init();
  81. for (i=0; i<m; ++i)
  82. {
  83. scanf("%d%d",&a,&b);
  84. add(a,b);
  85. }
  86. for (i=1; i<=n; ++i)
  87. if(dfn[i]==-1)
  88. Tarjan(i);
  89. for (u=1; u<=n; ++u)
  90. {
  91. for (j=head[u]; ~j; j=E[j].pre)
  92. {
  93. v=E[j].to;
  94. if(belong[v]==belong[u])
  95. continue;
  96. ++out[belong[u]];
  97. }
  98. }
  99. int zero_out=0;
  100. int scindx=-1;
  101. for (i=1; i<=sc; ++i)
  102. {
  103. if(!out[i])
  104. {
  105. ++zero_out;
  106. scindx=i;
  107. }
  108. }
  109. zero_out>1?puts("0"):printf("%d\n",scnum[scindx]);
  110. }
  111. return 0;
  112. }

BZOJ 1051 受欢迎的牛(Tarjan缩点)的更多相关文章

  1. bzoj 1051 受欢迎的牛-tarjan

    https://www.lydsy.com/JudgeOnline/problem.php?id=1051 如果A喜欢B,那么A->B连边,那么整个图储存下来,如果有好多个牛是受欢迎的,那么他们 ...

  2. bzoj 1051: [HAOI2006]受欢迎的牛 tarjan缩点

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2092  Solved: 1096[Submit][Sta ...

  3. bzoj 1051: [HAOI2006]受欢迎的牛 (Tarjan 缩点)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1051 思路: 首先用Tarjan把环缩成点,要想收到所有人的欢迎,那么这个点的出度必为0,且 ...

  4. 【tarjan】BZOJ 1051:受欢迎的牛

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3134  Solved: 1642[Submit][Sta ...

  5. BZOJ 1051 受欢迎的牛 缩点

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1051 题目大意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数( ...

  6. BZOJ 1051 受欢迎的牛

    Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认 ...

  7. B1051 受欢迎的牛 tarjan缩点

    就是一道tarjan缩点的板子,之前在洛谷做过.但是我发现一个事,就是函数里面有一句话: void tarjan(int x) { dfn[x] = low[x] = ++tot; str[++top ...

  8. 【bzoj1051】 [HAOI2006]受欢迎的牛 tarjan缩点判出度算点数

    [bzoj1051] [HAOI2006]受欢迎的牛 2014年1月8日7450 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B ...

  9. bzoj1051 [HAOI2006]受欢迎的牛 tarjan&&缩点

    题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的——如果A喜 欢B,B喜欢C,那么A也喜欢C ...

随机推荐

  1. codeforces B. Dima and Text Messages 解题报告

    题目链接:http://codeforces.com/problemset/problem/358/B 题目意思:给出n个单词(假设为word1,word2.word3...wordn)和一句test ...

  2. OC内存管理--zombie对象

    当我们对于内存进行手动管理的时候,会出现两种错误:一种是野指针错误,一种则为内存泄露.这两点也是我们去管理内存时最终要解决的问题. 内存泄漏是指:不在使用的对象,一直保留在内存中未被销毁,一直占有着内 ...

  3. js 在myeclipse中报错

    转myeclipse中的js文件报错   整理一下,希望帮到 遇到此问题的哥们.姐们. 方法一:myeclipse9 很特殊 和 myeclipse10 不一样,所以myeclipse9 不能使用该方 ...

  4. MVC中session创建并获取问题

    有两个ActionResult分别为A和B,如下 public ActionResult A() { Session["test"]="123"; return ...

  5. 会员制实现C2B定制有机农产品,被中粮我买投资的良食网这样卖有机生鲜

    前几天,中粮我买网战略投资了位于深圳的有机生鲜自营平台良食网,宣布双方将会在供应链上展开合作.然而良食网对大家来说还是比较陌生的,为此36氪专访了良食网的创始人唐忠. 良食网成立于2011年,是一家以 ...

  6. ytu 1940:Palindromes _easy version(水题)

    Palindromes _easy version Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 47  Solved: 27[Submit][Statu ...

  7. Java Hour 39 Maven ( 1 )

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. Hour 39 Maven 1 Perhaps you are running ...

  8. jquery笔记(仅供个人参考)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  9. hdu 3466 排序01背包

    也是好题,带限制的01背包,先排序,再背包 这题因为涉及到q,所以不能直接就01背包了.因为如果一个物品是5 9,一个物品是5 6,对第一个进行背包的时候只有dp[9],dp[10],…,dp[m], ...

  10. Xamarin Android长度单位区别

    Xamarin Android长度单位区别 Android中长度单位有6种:px.in.mm.pt.dp/dip.sp.其中,px表示显示设备的一个像素:in表示显示设备的1英寸:mm表示显示设备的1 ...