题目大意

lue..

题解

先跑一遍tarjan缩点,在新图中加入两个强连通分量之间的边,则此图为一个有向无环图(DAG)。则最终答案为1点所在的强连通分量或包括1点的几个强连通分量的点数之和。

如果为几个强连通分量则由于该图为DAG而题中要求为从1点出发又回到1点,

故路径中一定包含一条反向边。又由于强连同分量中的点彼此强连同,故该反向边一定为两个强连同分量之间的边。

故路径为一条边+一条经过一点所在强连通分量的路径。

图中每个点代表一个强连通分量。其中1为包含1点的强通分量。

其中路径为k-->........3-->1-->2-->4-->......-->n,而反向边为边k-->n

因此,最终答案即为求如上一条包含点最多的路径。

考虑边k-->n,边k-->n一定为缩点后强连通分量之间的边。如果首先求出路径长度则枚举边k-->n即可。而路径长度一定为k-->1的包含点最多的路径长度与1-->n的包含点最多的路径的点的个数之和减1点所在的强连通分量包含的点的个数。

故可以预处理出1点所在的强连通分量到其他强连通分量的路径中最多包含点的个数,再将所有强连通分量间的边反向,求1点所在的强连通分量到其他强连通分量的路径中最多包含点的个数,既求其他强连通分量到1点所在的强连通分量的路径中最多包含点的个数。

最后枚举所有强连通分量之间的边k-->n,答案为 max(f1[n]+f2[k]-size[bel[1]])

注意:当f1或f2为0时不更新答案因为如果为0则代表1点所在的强连通分量

无法到达n点或k点。

Tarjan时间复杂度为O(n+m),两次DAG上求最长路的时间复杂度为O(m)

总体时间复杂度O(n+m)。

(hhh一看就不是我自己写的题解...改不动了hhh)

  1. #include<stack>
  2. #include<queue>
  3. #include<stdio.h>
  4. #include<string.h>
  5. #include<algorithm>
  6. using namespace std;
  7. #define N 110000
  8. int n,m,ans;
  9. int t1,t2,tot,scc,cnt;
  10. int head[N],to[*N],nex[*N];
  11. int deep[N],low[N],bel[N],vis[N];
  12. int ins[N],inq[N],size[N];
  13. int f1[N],f2[N];
  14. stack<int>s;
  15. queue<int>que;
  16. void add(int x,int y)
  17. {
  18. tot++;
  19. nex[tot]=head[x];
  20. head[x]=tot;
  21. to[tot]=y;
  22. }
  23. int tot1;
  24. int head1[N],to1[*N],nex1[*N],from1[*N];
  25. void add1(int x,int y)
  26. {
  27. tot1++;
  28. nex1[tot1]=head1[x];
  29. head1[x]=tot1;
  30. to1[tot1]=y;
  31. from1[tot1]=x;
  32. }
  33. int tot2;
  34. int head2[N],to2[*N],nex2[*N],from2[*N];
  35. void add2(int x,int y)
  36. {
  37. tot2++;
  38. nex2[tot2]=head2[x];
  39. head2[x]=tot2;
  40. to2[tot2]=y;
  41. from2[tot2]=x;
  42. }
  43. void tarjan(int x)
  44. {
  45. deep[x]=low[x]=++cnt;
  46. ins[x]=;
  47. vis[x]=;
  48. s.push(x);
  49. for(int i=head[x];i;i=nex[i])
  50. {
  51. if(ins[to[i]])
  52. low[x]=min(low[x],deep[to[i]]);
  53. else if(!vis[to[i]])
  54. {
  55. tarjan(to[i]);
  56. low[x]=min(low[x],low[to[i]]);
  57. }
  58. }
  59. if(deep[x]==low[x])
  60. {
  61. scc++;
  62. int tmp=s.top();
  63. s.pop();
  64. size[scc]++;
  65. bel[tmp]=scc;
  66. ins[tmp]=;
  67. while(tmp!=x)
  68. {
  69. tmp=s.top();
  70. s.pop();
  71. size[scc]++;
  72. ins[tmp]=;
  73. bel[tmp]=scc;
  74. }
  75. }
  76. }
  77. int main()
  78. {
  79. freopen("wander.in","r",stdin);
  80. freopen("wander.out","w",stdout);
  81. scanf("%d%d",&n,&m);
  82. for(int i=;i<=m;i++)
  83. {
  84. scanf("%d%d",&t1,&t2);
  85. add(t1,t2);
  86. }
  87. for(int i=;i<=n;i++)
  88. {
  89. if(!vis[i])
  90. {
  91. cnt=;
  92. tarjan(i);
  93. }
  94. }
  95. for(int i=;i<=n;i++)
  96. {
  97. for(int j=head[i];j;j=nex[j])
  98. if(bel[i]!=bel[to[j]])
  99. {
  100. add1(bel[i],bel[to[j]]);
  101. add2(bel[to[j]],bel[i]);
  102. }
  103. }
  104. que.push(bel[]);
  105. f1[bel[]]=size[bel[]];
  106. inq[bel[]]=;
  107. while(!que.empty())
  108. {
  109. int tmp=que.front();
  110. que.pop();
  111. inq[tmp]=;
  112. for(int i=head1[tmp];i;i=nex1[i])
  113. if(f1[to1[i]]<f1[tmp]+size[to1[i]])
  114. {
  115. f1[to1[i]]=f1[tmp]+size[to1[i]];
  116. if(!inq[to1[i]])
  117. {
  118. inq[to1[i]]=;
  119. que.push(to1[i]);
  120. }
  121. }
  122. }
  123. memset(inq,,sizeof(inq));
  124. que.push(bel[]);
  125. inq[bel[]]=;
  126. f2[bel[]]=size[bel[]];
  127. while(!que.empty())
  128. {
  129. int tmp=que.front();
  130. que.pop();
  131. inq[tmp]=;
  132. for(int i=head2[tmp];i;i=nex2[i])
  133. if(f2[to2[i]]<f2[tmp]+size[to2[i]])
  134. {
  135. f2[to2[i]]=f2[tmp]+size[to2[i]];
  136. if(!inq[to2[i]])
  137. {
  138. inq[to2[i]]=;
  139. que.push(to2[i]);
  140. }
  141. }
  142. }
  143. ans=max(ans,size[bel[]]);
  144. for(int i=;i<=tot2;i++)
  145. if(f2[to2[i]]&&f1[from2[i]])
  146. {
  147. if(f2[to2[i]]+f1[from2[i]]-size[bel[]]>ans)
  148. ans=f2[to2[i]]+f1[from2[i]]-size[bel[]];
  149. }
  150. printf("%d",ans);
  151. return ;
  152. }

std太强了

8.10-DayT3游走(wander)的更多相关文章

  1. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  2. 3143: [Hnoi2013]游走 - BZOJ

    Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...

  3. bzoj 3143: [Hnoi2013]游走 高斯消元

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1026  Solved: 448[Submit][Status] ...

  4. 数学(概率):HNOI2013 游走

    [题目描述] 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这 ...

  5. 介绍一个全局最优化的方法:随机游走算法(Random Walk)

    1. 关于全局最优化求解   全局最优化是一个非常复杂的问题,目前还没有一个通用的办法可以对任意复杂函数求解全局最优值.上一篇文章讲解了一个求解局部极小值的方法--梯度下降法.这种方法对于求解精度不高 ...

  6. [补档][Hnoi2013]游走

    [Hnoi2013]游走 题目 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一 ...

  7. 游走[HNOI2013]

    [题目描述] 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这 ...

  8. bzoj 3143: [Hnoi2013]游走

    Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...

  9. BZOJ 3143: [Hnoi2013]游走 [概率DP 高斯消元]

    一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ...

随机推荐

  1. Keras 回归 拟合 收集

    案例1 from keras.models import Sequential from keras.layers import Dense, LSTM, Activation from keras. ...

  2. 《深入理解java虚拟机》读书笔记十——第十一章

    第十一章  晚期(运行期)优化 1.HotSpot虚拟机内的即时编译 解释器与编译器: 许多Java虚拟机的执行引擎在执行Java代码的时候都有解释执行(通过解释器执行)和编译执行(通过即时编译器产生 ...

  3. Codeforce 515A - Drazil and Date

    Someday, Drazil wanted to go on date with Varda. Drazil and Varda live on Cartesian plane. Drazil's ...

  4. WSO2 ESB XML定义语法(2)

    5.Proxy Service 配置 <proxy>元素用于定义Synapse代理服务. 通过基础Axis2引擎在指定的传输上创建和公开代理服务,根据标准的Axis2约定(即基于服务名称) ...

  5. PP: Shallow RNNs: a method for accurate time-series classification on tiny devices

    Problem: time series classification shallow RNNs: the first layer splits the input sequence and runs ...

  6. [JSOI2010]快递服务

    Description Luogu4046 BZOJ1820 Solution 暴力DP很好想,\(f[i][j][k][l]\)表示处理到第\(i\)个任务,三个人在\(i,j,k\)的方案数.显然 ...

  7. 解决jquery.pjax加载后的异常滚动

    个人博客 地址:http://www.wenhaofan.com/article/20181106154356 在使用jquery.pjax的时候发现每次加载完成后都会将滚动条滚动至顶部,用户体验极不 ...

  8. AcWing 1019. 庆功会 多重背包求max

    //多重背包 max #include <iostream> using namespace std; ; int n, m; int f[N]; int main() { cin > ...

  9. docker 免sudo设置(仅3个命令)

    首先,下载docker, 需3话: sudo apt install docker.io sudo systemctl start docker sudo systemctl enable docke ...

  10. java继承与多态课后作业

    1.动手实验 源码 class Grandparent {     public Grandparent()  {          System.out.println("GrandPar ...