题目大概是,每个人收到信息后会把信息发给他认识的一个人如此下去,问一开始要把信息发送给谁这样看到信息的人数最多。

  • 首先找出图中的SCC并记录每个SCC里面的点数,如果传到一个SCC,那么里面的人都可以看到信息。
  • 然后SCC缩点后就形成DAG,直接记忆化搜索,d(u)搜索从u点出发开始传最多能传多少人。
  • 最后就是找答案了。
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. #define MAXN 55555
  6. #define MAXM 55555
  7.  
  8. struct Edge{
  9. int u,v,next;
  10. }edge[MAXM];
  11. int NE,head[MAXN];
  12. void addEdge(int u,int v){
  13. edge[NE].u=u; edge[NE].v=v; edge[NE].next=head[u];
  14. head[u]=NE++;
  15. }
  16.  
  17. int size[MAXN],bn,belong[MAXN];
  18. int stack[MAXN],top;
  19. bool instack[MAXN];
  20. int dn,dfn[MAXN],low[MAXN];
  21. void tarjan(int u){
  22. dfn[u]=low[u]=++dn;
  23. stack[++top]=u; instack[u]=;
  24. for(int i=head[u]; i!=-; i=edge[i].next){
  25. int v=edge[i].v;
  26. if(dfn[v]==){
  27. tarjan(v);
  28. low[u]=min(low[u],low[v]);
  29. }else if(instack[v]){
  30. low[u]=min(low[u],dfn[v]);
  31. }
  32. }
  33. if(dfn[u]==low[u]){
  34. int v; ++bn;
  35. do{
  36. v=stack[top--];
  37. instack[v]=;
  38. belong[v]=bn;
  39. ++size[bn];
  40. }while(u!=v);
  41. }
  42. }
  43.  
  44. int d[MAXN];
  45. int dfs(int u){
  46. if(d[u]) return d[u];
  47. int res=size[u],tmp=;
  48. for(int i=head[u]; i!=-; i=edge[i].next){
  49. int v=edge[i].v;
  50. tmp=max(tmp,dfs(v));
  51. }
  52. return d[u]=res+tmp;
  53. }
  54.  
  55. int main(){
  56. int t,n,a,b;
  57. scanf("%d",&t);
  58. for(int cse=; cse<=t; ++cse){
  59. NE=;
  60. memset(head,-,sizeof(head));
  61. scanf("%d",&n);
  62. for(int i=; i<n; ++i){
  63. scanf("%d%d",&a,&b);
  64. addEdge(a,b);
  65. }
  66.  
  67. top=bn=dn=;
  68. memset(instack,,sizeof(instack));
  69. memset(dfn,,sizeof(dfn));
  70. memset(size,,sizeof(size));
  71. for(int i=; i<=n; ++i){
  72. if(dfn[i]==) tarjan(i);
  73. }
  74.  
  75. int tmp=NE; NE=;
  76. memset(head,-,sizeof(head));
  77. for(int i=; i<tmp; ++i){
  78. int u=belong[edge[i].u],v=belong[edge[i].v];
  79. if(u==v) continue;
  80. addEdge(u,v);
  81. }
  82.  
  83. memset(d,,sizeof(d));
  84. int mx=;
  85. for(int i=; i<=bn; ++i){
  86. mx=max(mx,dfs(i));
  87. }
  88. for(int i=; i<=n; ++i){
  89. if(d[belong[i]]==mx){
  90. printf("Case %d: %d\n",cse,i);
  91. break;
  92. }
  93. }
  94. }
  95. return ;
  96. }

LightOJ1417 Forwarding Emails(强连通分量+缩点+记忆化搜索)的更多相关文章

  1. BNU 20860——Forwarding Emails——————【强连通图缩点+记忆化搜索】

    Forwarding Emails Time Limit: 1000ms Memory Limit: 131072KB This problem will be judged on UVA. Orig ...

  2. ZOJ3795 Grouping(强连通分量+缩点+记忆化搜索)

    题目给一张有向图,要把点分组,问最少要几个组使得同组内的任意两点不连通. 首先考虑找出强连通分量缩点后形成DAG,强连通分量内的点肯定各自一组,两个强连通分量的拓扑序能确定的也得各自一组. 能在同一组 ...

  3. UVa11324 The Largest Clique(强连通分量+缩点+记忆化搜索)

    题目给一张有向图G,要在其传递闭包T(G)上删除若干点,使得留下来的所有点具有单连通性,问最多能留下几个点. 其实这道题在T(G)上的连通性等同于在G上的连通性,所以考虑G就行了. 那么问题就简单了, ...

  4. [BZOJ1589] [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果(tarjan缩点 + 记忆化搜索)

    传送门 先用tarjan缩点,再记忆话搜索一下 #include <stack> #include <cstdio> #include <cstring> #inc ...

  5. UVA11324 The Largest Clique —— 强连通分量 + 缩点 + DP

    题目链接:https://vjudge.net/problem/UVA-11324 题解: 题意:给出一张有向图,求一个结点数最大的结点集,使得任意两个结点u.v,要么u能到达v, 要么v能到达u(u ...

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

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

  7. POJ1236Network of Schools(强连通分量 + 缩点)

    题目链接Network of Schools 参考斌神博客 强连通分量缩点求入度为0的个数和出度为0的分量个数 题目大意:N(2<N<100)各学校之间有单向的网络,每个学校得到一套软件后 ...

  8. HD2767Proving Equivalences(有向图强连通分量+缩点)

    题目链接 题意:有n个节点的图,现在给出了m个边,问最小加多少边是的图是强连通的 分析:首先找到强连通分量,然后把每一个强连通分量缩成一个点,然后就得到了一个DAG.接下来,设有a个节点(每个节点对应 ...

  9. POJ2553 The Bottom of a Graph(强连通分量+缩点)

    题目是问,一个有向图有多少个点v满足∀w∈V:(v→w)⇒(w→v). 把图的强连通分量缩点,那么答案显然就是所有出度为0的点. 用Tarjan找强连通分量: #include<cstdio&g ...

随机推荐

  1. PowerDesigner15在win7-64位系统下对MySQL反向工程

    由于机器是win64位的,下载的64的connector安装测试成功,但是在powerdesigner中测试连不上,总算在下面这边博友中找到解决方案! http://blog.csdn.net/web ...

  2. C#装箱和拆箱(值类型和引用类型之间的转换)

    面向对象编程中,封箱指把非对象类型的数值或数据,包装成对象类型反之,拆箱指把对象类型拆成非对象的数值或数据. 例子:定义一个Circle 类 class Circle { double radius; ...

  3. 又一款linux提权辅助工具

    又一款linux提权辅助工具 – Linux_Exploit_Suggester 2013-09-06 10:34 1455人阅读 评论(0) 收藏 举报 https://github.com/Pen ...

  4. coco2dx实现翻拍效果

    昨天吃饭看见同事演示他做的翻牌效果,感觉不错,我心血来潮也来搞个,很简单直接上代码. class FlipCard : public CCNode { public: CREATE_FUNC(Flip ...

  5. Java for LeetCode 148 Sort List

    Sort a linked list in O(n log n) time using constant space complexity. 解题思路: 归并排序.快速排序.堆排序都是O(n log ...

  6. 一台机器开2个Tomcat修改端口号

    修改一个Tomcat端口号步骤:1.找到Tomcat目录下的conf文件夹2.进入conf文件夹里面找到server.xml文件3.打开server.xml文件4.在server.xml文件里面找到下 ...

  7. ubuntu修改文件访问权限

    遇到“bash .....权限不够”的问题时, 从控制台进入到那个文件夹 chmod 777 * -R 全部子目录及文件权限改为 777

  8. July 20th, Week 30th Wednesday, 2016

    Learn from yesterday, live for today, and hope for tomorrow. 借鉴昨天,活着当下,憧憬未来. Yesterday is the past, ...

  9. python基础——使用dict和set

    python基础——使用dict和set dict Python内置了字典:dict的支持,dict全称dictionary,在其它语言中也称为map(映射),使用键-值(key-value)存储,具 ...

  10. ctrl + z fg bg

    [root@bass ~]# jobs [1]+ Stopped vncviewer 192.168.1.17:5904 [root@bass ~]# #ctrl + z [root@bass ~]# ...