题意:

1.初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件。

2.至少需要添加几条传输线路(边),使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件。

思路:

我们先把图中的强连通分量缩点

经过缩点后,就可以把强连通分量看成一个个独立的点,这张图可以模拟一下,有离散的点,有一些连起来的点,咳咳,但绝对不是连通的!

题目的问题1那不就是在新图上搞一搞出度==0的点的数量

题目的问题2要我们在这张新图上搞一个强连通图,我们可以根据强连通的性质,也就是每个点都要有被指向边和出去的边,那么也就是求一下每个点(强连通分量)的入度和出度,把出度==0的点个数加起来,把入度==0的点个数加起来,比一比谁大,输出谁,因为我们可以直接在入度为0和出度为0的两点间加边,所以取大的那个就满足。

这种题都一个套路。有点水的没意思了。如果没有搞过这种题,可以看我前面两篇blog…当然写的很水,主要可以我是想说可以做做那两题….

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<math.h>
  4. #include<stdlib.h>
  5. #include<vector>
  6. #include<string.h>
  7. #include<algorithm>
  8. using namespace std;
  9. typedef long long LL;
  10. #define INF 0x3f3f3f3f
  11. #define PI acos(-1.0)
  12. #define N 110
  13. int ma[N][N];
  14. int dfn[N];
  15. int low[N];
  16. int stap[N];
  17. int vis[N];
  18. int in[N];
  19. int tp,p,cnt;
  20. int kc[N];
  21. int kr[N];
  22. int n;
  23. void tarjan(int u)
  24. {
  25. dfn[u]=low[u]=++tp;
  26. stap[++p]=u;
  27. vis[u]=1;
  28. for(int i=1;i<=n;i++)
  29. {
  30. if(!ma[u][i])
  31. continue;
  32. if(!dfn[i])
  33. {
  34. tarjan(i);
  35. low[u]=min(low[u],low[i]);
  36. }
  37. else if(vis[i])
  38. {
  39. low[u]=min(low[u],dfn[i]);
  40. }
  41. }
  42. if(dfn[u]==low[u])
  43. {
  44. cnt++;
  45. int temp;
  46. while(1)
  47. {
  48. temp=stap[p];
  49. vis[temp]=0;
  50. in[temp]=cnt;
  51. p--;
  52. if(temp==u)
  53. {
  54. break;
  55. }
  56. }
  57. }
  58. }
  59. void fun()
  60. {
  61. int pc,pr;
  62. memset(kc,0,sizeof(kc));
  63. memset(kr,0,sizeof(kr));
  64. for(int i=1;i<=n;i++)
  65. {
  66. for(int j=1;j<=n;j++)
  67. {
  68. if(ma[i][j]&&in[i]!=in[j])
  69. {
  70. kr[in[j]]++;
  71. kc[in[i]]++;
  72. }
  73. }
  74. }
  75. pc=pr=0;
  76. for(int i=1;i<=cnt;i++)
  77. {
  78. if(!kr[i])
  79. {
  80. pr++;
  81. }
  82. if(!kc[i])
  83. {
  84. pc++;
  85. }
  86. }
  87. if(cnt==1)
  88. {
  89. printf("1\n0\n");
  90. }
  91. else
  92. printf("%d\n%d\n",pr,max(pr,pc));
  93. }
  94. void init()
  95. {
  96. memset(ma,0,sizeof(ma));
  97. memset(vis,0,sizeof(vis));
  98. memset(dfn,0,sizeof(dfn));
  99. }
  100. int main()
  101. {
  102. while(~scanf("%d",&n))
  103. {
  104. int x;
  105. init();
  106. for(int i=1;i<=n;i++)
  107. {
  108. while(scanf("%d",&x)&&x)
  109. ma[i][x]=1;
  110. }
  111. //找强连通分量
  112. tp=p=cnt=0;
  113. for(int i=1;i<=n;i++)
  114. {
  115. if(!dfn[i])
  116. {
  117. tarjan(i);
  118. }
  119. }
  120. fun();
  121. }
  122. return 0;
  123. }
  124. /*
  125. 5
  126. 2 4 3 0
  127. 4 5 0
  128. 0
  129. 0
  130. 1 0
  131. */

POJ1236【图的前连通(缩点)】的更多相关文章

  1. Semiconnected--强连通缩点

    1451: Semiconnected 时间限制: 1 Sec  内存限制: 32 MB 提交: 79  解决: 20 题目描述 For a directed graph G = (V, E), if ...

  2. hdu 4612 Warm up 双连通缩点+树的直径

    首先双连通缩点建立新图(顺带求原图的总的桥数,事实上因为原图是一个强连通图,所以桥就等于缩点后的边) 此时得到的图类似树结构,对于新图求一次直径,也就是最长链. 我们新建的边就一定是连接这条最长链的首 ...

  3. 使用OpenCV查找二值图中最大连通区域

    http://blog.csdn.net/shaoxiaohu1/article/details/40272875 使用OpenCV查找二值图中最大连通区域 标签: OpenCVfindCoutour ...

  4. 边双连通缩点+树dp 2015 ACM Arabella Collegiate Programming Contest的Gym - 100676H

    http://codeforces.com/gym/100676/attachments 题目大意: 有n个城市,有m条路,每条路都有边长,如果某几个城市的路能组成一个环,那么在环中的这些城市就有传送 ...

  5. loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点

    loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...

  6. poj 3352 Road Construction【边双连通求最少加多少条边使图双连通&&缩点】

    Road Construction Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10141   Accepted: 503 ...

  7. Hdu4005-The war(双连通缩点)

    In the war, the intelligence about the enemy is very important. Now, our troop has mastered the situ ...

  8. POJ 3177 Redundant Paths (边双连通+缩点)

    <题目链接> <转载于 >>>  > 题目大意: 有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新 ...

  9. UVA 10972 RevolC FaeLoN(边-双连通+缩点)

    很好的一道图论题,整整撸了一上午... 题意是给定一个无向图,要求将所有边变为有向边,求最少加入多少条有向边,使得该图强连通?这里先假设一个问题:给定一个无向子图,该子图具有怎样的性质才能使得将其无向 ...

随机推荐

  1. vim note (1)

    'vim' go into the vim mode 'i' 'a' 's'    is means insert mode 'v' is means visual mode 'esc' is mea ...

  2. 利用ctypes调用Fortran程序

    本来python下面调用fortran最傻瓜方便的办法就是f2py,但是若fortran和C混合编程的代码,分别指定gfortran和gcc为编译器,在windows下面f2py直接报错 那么ctyp ...

  3. Vs2012在Linux开发中的应用(6):改写Makefile项目的Build过程

    MSBUILD的编译过程实际上是依据一系列的targets文件定义的.当我们在IDE运行生成.批生成.清理命令的时候.VS会查找这些命令相应的Task并运行它,以下我们逐个分析这个过程. 当运行生成操 ...

  4. Django 之 form表单

    Django中的Form表单 1.背景 平时我们在书写form表单时,经常都是手动的去写一些input标签,让用户输入一些功能,进行一些校验的判断,等等.Django中的form表单就能够帮我们去实现 ...

  5. MD5加密实现类不是Windows平台下联邦信息处理标准验证过的加密算法的一部分

    在.NET应用程序中,MD5CryptoServiceProvider实例化时,造成This implementation is not part of the Windows Platform FI ...

  6. Spring中的AOP(学习笔记)

    是什么AOP及实现方式 AOP的基本概念 Schema-base AOP Spring AOP API AspectJ

  7. PPAPI与Browser间使用AsyncIPC通信

    採用AsyncIpc这个项目(https://github.com/hicdre/AsyncIpc).来完毕PPAPI Plugin进程与Browser进程的通信. foruok原创.如需转载请关注f ...

  8. Linux epoll 源码注释

    https://www.cnblogs.com/stonehat/p/8613505.html 这篇文章值得好好读,先留个记录,回头看. IO多路复用之epoll总结 - Anker's Blog - ...

  9. Qt & opencv 学习(一)

    Qt也没怎么系统学过,opencv也没系统学过.慢慢来,一步一步弄清楚吧. 天嵌科技有个文档,先去看这个文档,主要是开发环境的配置.文档名字就是QT应用程序开发手册-20150918.pdf.在QT里 ...

  10. golang-----golang sync.WaitGroup解决goroutine同步

    go提供了sync包和channel来解决协程同步和通讯.新手对channel通道操作起来更容易产生死锁,如果时缓冲的channel还要考虑channel放入和取出数据的速率问题. 从字面就可以理解, ...