【题目链接】

点击打开链接

【算法】

对于第一问,将这个图缩点,输出出度为零的点的个数

对于第二问,同样将这个图缩点,输出入度为零、出度为零的点的个数的最大值

【代码】

  1. #include <algorithm>
  2. #include <bitset>
  3. #include <cctype>
  4. #include <cerrno>
  5. #include <clocale>
  6. #include <cmath>
  7. #include <complex>
  8. #include <cstdio>
  9. #include <cstdlib>
  10. #include <cstring>
  11. #include <ctime>
  12. #include <deque>
  13. #include <exception>
  14. #include <fstream>
  15. #include <functional>
  16. #include <limits>
  17. #include <list>
  18. #include <map>
  19. #include <iomanip>
  20. #include <ios>
  21. #include <iosfwd>
  22. #include <iostream>
  23. #include <istream>
  24. #include <ostream>
  25. #include <queue>
  26. #include <set>
  27. #include <sstream>
  28. #include <stdexcept>
  29. #include <streambuf>
  30. #include <string>
  31. #include <utility>
  32. #include <vector>
  33. #include <cwchar>
  34. #include <cwctype>
  35. #include <stack>
  36. #include <limits.h>
  37. using namespace std;
  38. #define MAXN 10010
  39.  
  40. struct Edge
  41. {
  42. int to,nxt;
  43. } e[MAXN];
  44.  
  45. int i,x,n,tot,timer,top,cnt;
  46. int head[MAXN],dfn[MAXN],low[MAXN],stk[MAXN],belong[MAXN];
  47. bool instack[MAXN];
  48.  
  49. template <typename T> inline void read(T &x)
  50. {
  51. int f = ; x = ;
  52. char c = getchar();
  53. for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
  54. for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
  55. x *= f;
  56. }
  57. template <typename T> inline void write(T x)
  58. {
  59. if (x < )
  60. {
  61. putchar('-');
  62. x = -x;
  63. }
  64. if (x > ) write(x/);
  65. putchar(x%+'');
  66. }
  67. template <typename T> inline void writeln(T x)
  68. {
  69. write(x);
  70. puts("");
  71. }
  72. inline void add(int u,int v)
  73. {
  74. tot++;
  75. e[tot] = (Edge){v,head[u]};
  76. head[u] = tot;
  77. }
  78. inline void tarjan(int u)
  79. {
  80. int i,v;
  81. dfn[u] = low[u] = ++timer;
  82. instack[u] = true;
  83. stk[++top] = u;
  84. for (i = head[u]; i; i = e[i].nxt)
  85. {
  86. v = e[i].to;
  87. if (!dfn[v])
  88. {
  89. tarjan(v);
  90. low[u] = min(low[u],low[v]);
  91. } else
  92. {
  93. if (instack[v])
  94. low[u] = min(low[u],dfn[v]);
  95. }
  96. }
  97. if (dfn[u] == low[u])
  98. {
  99. cnt++;
  100. while (stk[top+] != u)
  101. {
  102. instack[stk[top]] = false;
  103. belong[stk[top]] = cnt;
  104. top--;
  105. }
  106. }
  107. }
  108. inline void solve()
  109. {
  110. int i,j,s1 = ,s2 = ;
  111. static int in[MAXN],out[MAXN];
  112. memset(in,,sizeof(in));
  113. memset(out,,sizeof(out));
  114. memset(dfn,,sizeof(dfn));
  115. memset(low,,sizeof(low));
  116. cnt = timer = ;
  117. for (i = ; i <= n; i++)
  118. {
  119. if (!dfn[i])
  120. tarjan(i);
  121. }
  122. for (i = ; i <= n; i++)
  123. {
  124. for (j = head[i]; j; j = e[j].nxt)
  125. {
  126. if (belong[i] != belong[e[j].to])
  127. {
  128. in[belong[e[j].to]]++;
  129. out[belong[i]]++;
  130. }
  131. }
  132. }
  133. for (i = ; i <= cnt; i++)
  134. {
  135. if (!in[i]) s1++;
  136. if (!out[i]) s2++;
  137. }
  138. if (cnt == ) printf("%d\n%d\n",,);
  139. else printf("%d\n%d\n",s1,max(s1,s2));
  140. }
  141.  
  142. int main() {
  143.  
  144. while (scanf("%d",&n) != EOF)
  145. {
  146. tot = ;
  147. for (i = ; i <= n; i++) head[i] = ;
  148. for (i = ; i <= n; i++)
  149. {
  150. while (scanf("%d",&x) && x) add(i,x);
  151. }
  152. solve();
  153. }
  154.  
  155. return ;
  156.  
  157. }

【IOI 1996】 Network of Schools的更多相关文章

  1. 【POJ 3694】 Network(割边&lt;桥&gt;+LCA)

    [POJ 3694] Network(割边+LCA) Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7971 ...

  2. 【图论】Network of Schools

    [POJ1236]Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18969   Acc ...

  3. 【IOI 1998】 Picture

    [题目链接] 点击打开链接 [算法] 线段树扫描线求周长并 [代码] #include <algorithm> #include <bitset> #include <c ...

  4. 【POJ 1144】 Network

    [题目链接] 点击打开链接 [算法] Tarjan算法求割点 [代码] #include <algorithm> #include <bitset> #include < ...

  5. 【BZOJ 3732】 Network

    [题目链接] 点击打开链接 [算法] 求出这个图的最小生成树,对于每次询问,用倍增法求出最近公共祖先,查询最小生成树上两点路径上的最大值 算法的正确性?            假设x和y在最小生成树中 ...

  6. 【IOI 1994】 The Buses

    [题目链接] http://poj.org/problem?id=1167 [算法] 深度优先搜索 + 迭代加深 [代码] #include <algorithm> #include &l ...

  7. 【IOI 2011】Race

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2599 [算法] 点分治 [代码] #include<bits/stdc++.h ...

  8. 【poj1236】 Network of Schools

    http://poj.org/problem?id=1236 (题目链接) 题意 给定一个有向图,求:1.至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点:2.至少要加多少条边,才能使得从任 ...

  9. 【洛谷P2746】Network of Schools

    题目大意:给定一个 N 个点,M 条边的有向图,第一问求至少从多少个点出发才能遍历整个有向图,第二问求至少在这个有向图的基础上加多少条边才能使得该无向图强连通. 题解:先进行 Tarjan 缩点,得到 ...

随机推荐

  1. POJ 2375 Cow Ski Area【tarjan】

    题目大意:一个W*L的山,每个山有个高度,当且仅当一个山不比它相邻(有公共边的格子)的山矮时能够滑过去,现在可以装化学电梯来无视山的高度滑雪,问最少装多少电梯使得任意两点都可到达 思路:最后一句话已经 ...

  2. HDU 3527 SPY

    http://poj.org/problem?id=3615 基础题 狂STL #include <bits/stdc++.h> using namespace std; set<s ...

  3. less的配置和使用

    less 的配置: 1.浏览器端的使用 <link rel="stylesheet/less" type="text/css" href="st ...

  4. msp430项目编程14

    msp430中项目---电子测重系统 1.hx711工作原理 2.电路原理说明 3.代码(显示部分) 4.代码(功能实现) 5.项目总结 msp430项目编程 msp430入门学习

  5. HTTP请求示例

    HTTP请求格式 当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP请求信息由3部分组成: l   请求方法URI协议/版本 l   请求头(Request Hea ...

  6. IP聚合 ---百度之星(与运算)

    Problem Description 当今世界,网络已经无处不在了,小度熊由于犯了错误,当上了度度公司的网络管理员,他手上有大量的 IP列表,小度熊想知道在某个固定的子网掩码下,有多少个网络地址.网 ...

  7. js的offsetWidth,clientWidth

    js元素的offsetWidth与clientWidth很相似,因此放在一起记录. clientWidth与offsetWidth clientWidth=元素内容区域宽度+水平内边距padding. ...

  8. CDI Services *Decoretions *Intercepters * Scope * EL\(Sp EL) *Eventmodel

    1.Decorators装饰器综述 拦截器是一种强大的方法在应用程序捕捉运行方法和解耦.拦截器可以拦截任何java类型的调用.  这使得拦截器适合解决事务管理,安全性,以及日记记录.  本质上说,拦截 ...

  9. DELPHI最新的产品路线图

    1)根据众多像您一样的客户要求,我们改为一年一个重大版本及更多更新.这个计划回到一年发布周期并提供额外的2或3个包含附加功能及支持期间发布的新版操作系统的更新. 2)在 RAD Studio  10. ...

  10. 《gis空间分析及应用案例解析》培训总结

    <gis空间分析及应用案例解析>培训总结 来源:常德水情 作者:唐校准 发布日期:2014-01-02       2013年12月2630日由中国科学院计算技术研究所教育中心组织的< ...