题意:有N个学校,从每个学校都能从一个单向网络到另外一个学校。
1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件。
2:至少需要添加几条边,使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件。

解题关键:1、缩点之后求出入度为0的点的个数;

     2、缩点之后入度为0点和出度为0点的个数的max,(因为是任意点可到达全图),若存在点到达全图,添加入度-1条边即可。

注意特判只有一个节点的情况。

dfn需要初始化

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<cstdlib>
  5. #include<cmath>
  6. #include<algorithm>
  7. using namespace std;
  8. typedef long long ll;
  9. #define MAXN 120
  10. #define MAXM 100010
  11. struct edge{
  12. int to,nxt;
  13. }e[MAXM];
  14. int degree1[MAXN],degree2[MAXN];
  15. int head[MAXN],st[MAXN],dfn[MAXN],lowest[MAXN],belong[MAXN];
  16. bool inst[MAXN];
  17. int n,scnt,top,tot;//scnt从1开始
  18. void init(){
  19. memset(head,-,sizeof head);
  20. memset(degree1,,sizeof degree1);
  21. memset(degree2,,sizeof degree2);
  22. scnt=top=tot=;
  23. }
  24.  
  25. void add_edge(int u, int v){
  26. e[tot].to=v;
  27. e[tot].nxt=head[u];
  28. head[u]=tot++;
  29. }
  30.  
  31. void Tarjan(int u){
  32. dfn[u]=lowest[u]=++tot;
  33. inst[u]=;
  34. st[top++]=u;
  35. for(int i=head[u];i!=-;i=e[i].nxt){
  36. int v=e[i].to;
  37. if(!dfn[v]){
  38. Tarjan(v);
  39. lowest[u]=min(lowest[u],lowest[v]);
  40. }
  41. else if(inst[v]){
  42. lowest[u]=min(lowest[u],dfn[v]);//也可用lowest
  43. }
  44. }
  45. if(dfn[u]==lowest[u]){
  46. scnt++;
  47. int t;
  48. do{
  49. t=st[--top];
  50. inst[t]=false;
  51. belong[t]=scnt;
  52. }while(t!=u);
  53. }
  54. }
  55.  
  56. void solve(){//缩点
  57. for(int i=;i<=n;i++) if(!dfn[i]) Tarjan(i);
  58. for(int i=;i<=n;i++){
  59. for(int j=head[i];j!=-;j=e[j].nxt){
  60. if(belong[i]!=belong[e[j].to]){
  61. degree1[belong[i]]++,degree2[belong[e[j].to]]++;
  62. }
  63. }
  64. }
  65. int sum1=,sum2=;
  66. for(int i=;i<=scnt;i++){
  67. if(!degree1[i]) sum1++;
  68. if(!degree2[i]) sum2++;
  69. }
  70. if(scnt==){//1个节点进行特判
  71. printf("1\n0\n");
  72. return;
  73. }
  74. printf("%d\n",sum2);
  75. printf("%d\n",max(sum1,sum2));
  76. return;
  77. }
  78.  
  79. int main(){
  80. int a;
  81. while(scanf("%d",&n)!=EOF){
  82. init();
  83. int m=;
  84. while(scanf("%d",&a)){
  85. if(a==){
  86. m++;
  87. if(m>n) break;
  88. continue;
  89. }
  90. add_edge(m,a);
  91. }
  92. solve();
  93. }
  94. return ;
  95. }

[poj1236]Network of Schools(targin缩点SCC)的更多相关文章

  1. P2746 [USACO5.3]校园网Network of Schools// POJ1236: Network of Schools

    P2746 [USACO5.3]校园网Network of Schools// POJ1236: Network of Schools 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学 ...

  2. POJ1236 Network of Schools —— 强连通分量 + 缩点 + 入出度

    题目链接:http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Tot ...

  3. 洛谷 P2746 [USACO5.3]校园网Network of Schools (Tarjan,SCC缩点,DAG性质)

    P2746 [USACO5.3]校园网Network of Schools https://www.luogu.org/problem/P2746 题目描述 一些学校连入一个电脑网络.那些学校已订立了 ...

  4. POJ1236 Network of Schools (强连通)(缩点)

                                                                Network of Schools Time Limit: 1000MS   ...

  5. poj-1236.network of schools(强连通分量 + 图的入度出度)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 27121   Accepted: 10 ...

  6. POJ1236 - Network of Schools tarjan

                                                     Network of Schools Time Limit: 1000MS   Memory Limi ...

  7. POJ 1236 Network of Schools Tarjan缩点

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22729   Accepted: 89 ...

  8. POJ-1236 Network of Schools,人生第一道Tarjan....

    Network of Schools 题意:若干个学校组成一个计算机网络系统,一个学校作为出发端连接着若干个学校,信息可以传送到这些学校.被链接的学校不需要再次与出发端相连,现在问你:A:最少选几个学 ...

  9. POJ 1236 Network of Schools (Tarjan + 缩点)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12240   Accepted: 48 ...

随机推荐

  1. input file 选择Excel

    说明:开发环境 vs2012 asp.net mvc4 c# ,使用file 选择Excel文件 传到后台 使用Aspose.Cells获取Excel sheet页的名称 1.HTML代码 <% ...

  2. 九度OJ 1160:放苹果 (DFS)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:998 解决:680 题目描述: 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和 ...

  3. for (const k in v){ 变量作用域

    for (const k in v){       const a=[11,22,33,44]for(let i in a ){console.log(i)i=i+1}console.log('--- ...

  4. 我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行

    习惯了在IDE工具上进行代码编写,连最基本的Javac命令和Java命令都忘记的差不多了,今天对一个Java内部类进行编译和运行的时候,就出糗了.IDE是把双刃剑,它可以什么都帮你做了,你只要敲几行代 ...

  5. Wireshark学习笔记——怎样高速抓取HTTP数据包

    0.前言     在火狐浏览器和谷歌浏览器中能够很方便的调试network(抓取HTTP数据包),可是在360系列浏览器(兼容模式或IE标准模式)中抓取HTTP数据包就不那么那么方便了.尽管也可使用H ...

  6. AndroidUI组件之ImageSwitcher

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/gc_gongchao/article/details/25594669 今天继续AndroidUI组 ...

  7. vim中跳到第一行和最后一行

    底线命令模式 :0或:1跳到文件第一行 :$跳到文件最后一行 命令模式 gg跳到第一行 shift+g跳到文件最后一行

  8. JavaMail发送和接收邮件

    一.JavaMail概述:        JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类.但它并没有包含在JDK中,而是作为JavaEE的一部分. 厂商所提供 ...

  9. Spring Boot2.0之 监控管理

    Spring boot监控中心: 针对微服务的服务状态,服务器的内存变化(内存.线程.日志管理等)检测服务配置连接地址是否有用(有些懒加载的情况下,用的时候发现卧槽不能用)模拟访问,懒加载.统计有多少 ...

  10. dotnet core on Linux 环境搭建及入门demo

    首先感谢张善友大大提供的腾讯云实验室链接(https://www.qcloud.com/developer/labs/list). 以下是整个搭建过程及简单demo实例 1.搭建 .NET Core ...