[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=1791

[算法]

不难看出,要求的是这个基环树森林中每棵基环树的直径之和

[代码]

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 1e6 + ;
  4.  
  5. struct edge
  6. {
  7. int to,w,nxt;
  8. } e[MAXN << ];
  9.  
  10. int i,v,w,tot,n,u,cnt;
  11. int degree[MAXN],belong[MAXN],head[MAXN];
  12. long long d[MAXN],f[MAXN],a[MAXN << ],sum[MAXN << ];
  13. long long ans;
  14. bool cal[MAXN];
  15.  
  16. inline void addedge(int u,int v,int w)
  17. {
  18. tot++;
  19. e[tot] = (edge){v,w,head[u]};
  20. head[u] = tot;
  21. }
  22. inline void bfs(int u,int t)
  23. {
  24. int i,cur,v,w;
  25. queue< int > q;
  26. belong[u] = t;
  27. q.push(u);
  28. while (!q.empty())
  29. {
  30. cur = q.front();
  31. q.pop();
  32. for (i = head[cur]; i; i = e[i].nxt)
  33. {
  34. v = e[i].to;
  35. w = e[i].w;
  36. if (!belong[v])
  37. {
  38. belong[v] = t;
  39. q.push(v);
  40. }
  41. }
  42. }
  43. }
  44. inline void topsort()
  45. {
  46. int i,u,v,w;
  47. queue< int > q;
  48. for (i = ; i <= n; i++)
  49. {
  50. if (degree[i] == )
  51. q.push(i);
  52. }
  53. while (!q.empty())
  54. {
  55. u = q.front();
  56. q.pop();
  57. for (i = head[u]; i; i = e[i].nxt)
  58. {
  59. v = e[i].to;
  60. w = e[i].w;
  61. if (degree[v] > )
  62. {
  63. d[belong[u]] = max(d[belong[u]],f[u] + f[v] + w);
  64. f[v] = max(f[v],f[u] + w);
  65. if ((--degree[v]) == ) q.push(v);
  66. }
  67. }
  68. }
  69. }
  70. inline void dp(int t,int x)
  71. {
  72. long long i,l,r,y = x,m = ,v,w;
  73. static int q[MAXN << ];
  74. do
  75. {
  76. a[++m] = f[y];
  77. degree[y] = ;
  78. for (i = head[y]; i; i = e[i].nxt)
  79. {
  80. v = e[i].to;
  81. w = e[i].w;
  82. if (degree[v] > )
  83. {
  84. y = v;
  85. sum[m + ] = sum[m] + w;
  86. break;
  87. }
  88. }
  89. } while(i);
  90. if (m == )
  91. {
  92. l = ;
  93. for (i = head[y]; i; i = e[i].nxt)
  94. {
  95. v = e[i].to;
  96. w = e[i].w;
  97. if (v == x) l = max(l,w);
  98. }
  99. d[t] = max(d[t],f[x] + f[y] + l);
  100. return;
  101. }
  102. for (i = head[y]; i; i = e[i].nxt)
  103. {
  104. v = e[i].to;
  105. w = e[i].w;
  106. if (v == x)
  107. {
  108. sum[m + ] = sum[m] + w;
  109. break;
  110. }
  111. }
  112. for (i = ; i < m; i++)
  113. {
  114. a[m + i] = a[i];
  115. sum[m + i] = sum[m + ] + sum[i];
  116. }
  117. q[l = r = ] = ;
  118. for (i = ; i <= * m - ; i++)
  119. {
  120. while (l <= r && i - q[l] >= m) l++;
  121. d[t] = max(d[t],a[q[l]] + a[i] + sum[i] - sum[q[l]]);
  122. while (l <= r && a[q[r]] - sum[q[r]] <= a[i] - sum[i]) r--;
  123. q[++r] = i;
  124. }
  125. }
  126. int main()
  127. {
  128.  
  129. scanf("%d",&n);
  130. for (u = ; u <= n; u++)
  131. {
  132. scanf("%d%d",&v,&w);
  133. addedge(u,v,w);
  134. addedge(v,u,w);
  135. degree[u]++; degree[v]++;
  136. }
  137. for (i = ; i <= n; i++)
  138. {
  139. if (!belong[i])
  140. bfs(i,++cnt);
  141. }
  142. topsort();
  143. for (i = ; i <= n; i++)
  144. {
  145. if (degree[i] > && !cal[belong[i]])
  146. {
  147. cal[belong[i]] = true;
  148. dp(belong[i],i);
  149. ans += d[belong[i]];
  150. }
  151. }
  152. printf("%lld\n",ans);
  153.  
  154. return ;
  155.  
  156. }

[IOI 2008] Island的更多相关文章

  1. 「BZOJ 1791」「IOI 2008」Island「基环树」

    题意 求基环树森林所有基环树的直径之和 题解 考虑的一个基环树的直径,只会有两种情况,第一种是某个环上结点子树的直径,第二种是从两个环上结点子树内的最深路径,加上环上这两个结点之间的较长路径. 那就找 ...

  2. 『Island 基环树直径』

    Island(IOI 2008) Description 你准备浏览一个公园,该公园由 N 个岛屿组成,当地管理部门从每个岛屿 i 出发向另外一个岛屿建了一座长度为 L_i 的桥,不过桥是可以双向行走 ...

  3. HDUOJ-------2493Timer(数学 2008北京现场赛H题)

    Timer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  4. 在离线环境中发布.NET Core至Windows Server 2008

    在离线环境中发布.NET Core至Windows Server 2008 0x00 写在开始 之前一篇博客中写了在离线环境中使用.NET Core,之后一边学习一边写了一些页面作为测试,现在打算发布 ...

  5. Windows Server 2008 R2常规安全设置及基本安全策略

    这篇文章主要介绍了Windows Web Server 2008 R2服务器简单安全设置,需要的朋友可以参考下 用的腾讯云最早选购的时候悲催的只有Windows Server 2008 R2的系统,原 ...

  6. Windows Server 2008 小操作汇总

    用惯了Windows2003,去配置2008的时候还真有点摸不着头脑.干脆把有用到的都列在这里,方便后续查找. 一.安装IIS.Telnet      点击:开始 -> 管理工具 -> 服 ...

  7. Windows 2008 R2 安装sp1时未知错误的解决办法

    最近在为Windows Server 2008 R2 打sp1补丁时出现“发生未知错误”,详细信息错误:0x800f0818: google后找到解决问题步骤,参照:http://www.wikiho ...

  8. 如何在Windows Server 2008 R2没有磁盘清理工具的情况下使用系统提供的磁盘清理工具

    今天,刚好碰到服务器C盘空间满的情况,首先处理了临时文件和有关的日志文件后空间还是不够用,我知道清理C盘的方法有很多,但今天只分享一下如何在Windows Server 2008 R2没有磁盘清理工具 ...

  9. [vs2008]Visual Studio 2008 SP1添加或删除功能提示查找SQLSysClrTypes.msi文件

    前言 今天接到领导布置的一个任务,是之前同事负责的项目.离职了,现在客户有些地方需要修改,由于我之前参与过,就落在我的头上了. 然后我就把代码弄了过来,打开发现其中需要用到水晶报表.(我觉得不好用,不 ...

随机推荐

  1. Bootstrap中container与container-fluid的区别

    /*0-768px以上宽度container为100%*/ .container { padding-right: 15px; padding-left: 15px; margin-right: au ...

  2. Java 开源博客 Solo 1.2.0 发布 - 一键启动

    Solo 1.2.0 正式发布了,感谢一直以来关注 B3log 开源的朋友! 在这个版本中,我们引入了一个新的特性 -- 独立模式: 不需要安装数据库.Servlet 容器 只需要安装好 Java 环 ...

  3. 关于python学习路线

    *Python进阶(目录/书籍/学习路线) 忘了从哪里转的了,没办法标记哦,实在不好意思... 目录:) 1. 简介&helloworld&开发环境配置 2.基本语法:标识符& ...

  4. THREE.js代码备份——webgl - materials - cube refraction [balls](以上下左右前后6张图片构成立体场景、透明球体效果)

    <!DOCTYPE html> <html lang="en"> <head> <title>three.js webgl - ma ...

  5. 2016年8月17日 内省(1)18_黑马程序员_使用beanUtils操纵javabean

    8.内省(1):18_黑马程序员_使用beanUtils操纵javabean 1.导入两个包: 2.调用静态方法. 9.泛型 map.entrySet() :取出map集合的键值对组成一个set集合. ...

  6. Tomcat jsp页面显示有问题

    1.干掉tomcat下的work文件夹里面的东西,让jsp文件重新编译,相当于清楚缓存 2.work 里面是 jsp 编译的类 ,只要jsp 被访问了,就会被编译,就会生成相应的类 3.tomcat下 ...

  7. linux中tomcat启动脚本:关闭、发布、重启、测试是否成功

    说明 在使用jenkins持续集成时,需要实现自动发布包到tomcat.该脚本实现了在jenkins将包发送到linux服务器上后的自动关闭.发布.启动.测试启动是否成功的过程 思路 该思路以tomc ...

  8. elasticsearch重建索引

    1.重建索引 一个field的设置是不能被修改的,如果要修改一个Field,那么应该重新按照新的mapping,建立一个index,然后将数据批量查询出来,重新用bulk api写入index中 批量 ...

  9. Day 18 hashlib,logging模块

    hashlib 模块 作用:hash是一种算法,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法,该算法接受传入的内容,经过运算得到一串hash值 特点: 1.只要 ...

  10. 三种办法来安装Python3.x

    Centos7默认自带了Python2.7版本,但是因为项目需要使用Python3.x你可以按照此文的三个方法进行安装. 注:本文示例安装版本为Python3.5, 一.Python源代码编译安装 安 ...