[IOI 2008] Island
[题目链接]
https://www.lydsy.com/JudgeOnline/problem.php?id=1791
[算法]
不难看出,要求的是这个基环树森林中每棵基环树的直径之和
[代码]
- #include<bits/stdc++.h>
- using namespace std;
- const int MAXN = 1e6 + ;
- struct edge
- {
- int to,w,nxt;
- } e[MAXN << ];
- int i,v,w,tot,n,u,cnt;
- int degree[MAXN],belong[MAXN],head[MAXN];
- long long d[MAXN],f[MAXN],a[MAXN << ],sum[MAXN << ];
- long long ans;
- bool cal[MAXN];
- inline void addedge(int u,int v,int w)
- {
- tot++;
- e[tot] = (edge){v,w,head[u]};
- head[u] = tot;
- }
- inline void bfs(int u,int t)
- {
- int i,cur,v,w;
- queue< int > q;
- belong[u] = t;
- q.push(u);
- while (!q.empty())
- {
- cur = q.front();
- q.pop();
- for (i = head[cur]; i; i = e[i].nxt)
- {
- v = e[i].to;
- w = e[i].w;
- if (!belong[v])
- {
- belong[v] = t;
- q.push(v);
- }
- }
- }
- }
- inline void topsort()
- {
- int i,u,v,w;
- queue< int > q;
- for (i = ; i <= n; i++)
- {
- if (degree[i] == )
- q.push(i);
- }
- while (!q.empty())
- {
- u = q.front();
- q.pop();
- for (i = head[u]; i; i = e[i].nxt)
- {
- v = e[i].to;
- w = e[i].w;
- if (degree[v] > )
- {
- d[belong[u]] = max(d[belong[u]],f[u] + f[v] + w);
- f[v] = max(f[v],f[u] + w);
- if ((--degree[v]) == ) q.push(v);
- }
- }
- }
- }
- inline void dp(int t,int x)
- {
- long long i,l,r,y = x,m = ,v,w;
- static int q[MAXN << ];
- do
- {
- a[++m] = f[y];
- degree[y] = ;
- for (i = head[y]; i; i = e[i].nxt)
- {
- v = e[i].to;
- w = e[i].w;
- if (degree[v] > )
- {
- y = v;
- sum[m + ] = sum[m] + w;
- break;
- }
- }
- } while(i);
- if (m == )
- {
- l = ;
- for (i = head[y]; i; i = e[i].nxt)
- {
- v = e[i].to;
- w = e[i].w;
- if (v == x) l = max(l,w);
- }
- d[t] = max(d[t],f[x] + f[y] + l);
- return;
- }
- for (i = head[y]; i; i = e[i].nxt)
- {
- v = e[i].to;
- w = e[i].w;
- if (v == x)
- {
- sum[m + ] = sum[m] + w;
- break;
- }
- }
- for (i = ; i < m; i++)
- {
- a[m + i] = a[i];
- sum[m + i] = sum[m + ] + sum[i];
- }
- q[l = r = ] = ;
- for (i = ; i <= * m - ; i++)
- {
- while (l <= r && i - q[l] >= m) l++;
- d[t] = max(d[t],a[q[l]] + a[i] + sum[i] - sum[q[l]]);
- while (l <= r && a[q[r]] - sum[q[r]] <= a[i] - sum[i]) r--;
- q[++r] = i;
- }
- }
- int main()
- {
- scanf("%d",&n);
- for (u = ; u <= n; u++)
- {
- scanf("%d%d",&v,&w);
- addedge(u,v,w);
- addedge(v,u,w);
- degree[u]++; degree[v]++;
- }
- for (i = ; i <= n; i++)
- {
- if (!belong[i])
- bfs(i,++cnt);
- }
- topsort();
- for (i = ; i <= n; i++)
- {
- if (degree[i] > && !cal[belong[i]])
- {
- cal[belong[i]] = true;
- dp(belong[i],i);
- ans += d[belong[i]];
- }
- }
- printf("%lld\n",ans);
- return ;
- }
[IOI 2008] Island的更多相关文章
- 「BZOJ 1791」「IOI 2008」Island「基环树」
题意 求基环树森林所有基环树的直径之和 题解 考虑的一个基环树的直径,只会有两种情况,第一种是某个环上结点子树的直径,第二种是从两个环上结点子树内的最深路径,加上环上这两个结点之间的较长路径. 那就找 ...
- 『Island 基环树直径』
Island(IOI 2008) Description 你准备浏览一个公园,该公园由 N 个岛屿组成,当地管理部门从每个岛屿 i 出发向另外一个岛屿建了一座长度为 L_i 的桥,不过桥是可以双向行走 ...
- HDUOJ-------2493Timer(数学 2008北京现场赛H题)
Timer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- 在离线环境中发布.NET Core至Windows Server 2008
在离线环境中发布.NET Core至Windows Server 2008 0x00 写在开始 之前一篇博客中写了在离线环境中使用.NET Core,之后一边学习一边写了一些页面作为测试,现在打算发布 ...
- Windows Server 2008 R2常规安全设置及基本安全策略
这篇文章主要介绍了Windows Web Server 2008 R2服务器简单安全设置,需要的朋友可以参考下 用的腾讯云最早选购的时候悲催的只有Windows Server 2008 R2的系统,原 ...
- Windows Server 2008 小操作汇总
用惯了Windows2003,去配置2008的时候还真有点摸不着头脑.干脆把有用到的都列在这里,方便后续查找. 一.安装IIS.Telnet 点击:开始 -> 管理工具 -> 服 ...
- Windows 2008 R2 安装sp1时未知错误的解决办法
最近在为Windows Server 2008 R2 打sp1补丁时出现“发生未知错误”,详细信息错误:0x800f0818: google后找到解决问题步骤,参照:http://www.wikiho ...
- 如何在Windows Server 2008 R2没有磁盘清理工具的情况下使用系统提供的磁盘清理工具
今天,刚好碰到服务器C盘空间满的情况,首先处理了临时文件和有关的日志文件后空间还是不够用,我知道清理C盘的方法有很多,但今天只分享一下如何在Windows Server 2008 R2没有磁盘清理工具 ...
- [vs2008]Visual Studio 2008 SP1添加或删除功能提示查找SQLSysClrTypes.msi文件
前言 今天接到领导布置的一个任务,是之前同事负责的项目.离职了,现在客户有些地方需要修改,由于我之前参与过,就落在我的头上了. 然后我就把代码弄了过来,打开发现其中需要用到水晶报表.(我觉得不好用,不 ...
随机推荐
- Bootstrap中container与container-fluid的区别
/*0-768px以上宽度container为100%*/ .container { padding-right: 15px; padding-left: 15px; margin-right: au ...
- Java 开源博客 Solo 1.2.0 发布 - 一键启动
Solo 1.2.0 正式发布了,感谢一直以来关注 B3log 开源的朋友! 在这个版本中,我们引入了一个新的特性 -- 独立模式: 不需要安装数据库.Servlet 容器 只需要安装好 Java 环 ...
- 关于python学习路线
*Python进阶(目录/书籍/学习路线) 忘了从哪里转的了,没办法标记哦,实在不好意思... 目录:) 1. 简介&helloworld&开发环境配置 2.基本语法:标识符& ...
- THREE.js代码备份——webgl - materials - cube refraction [balls](以上下左右前后6张图片构成立体场景、透明球体效果)
<!DOCTYPE html> <html lang="en"> <head> <title>three.js webgl - ma ...
- 2016年8月17日 内省(1)18_黑马程序员_使用beanUtils操纵javabean
8.内省(1):18_黑马程序员_使用beanUtils操纵javabean 1.导入两个包: 2.调用静态方法. 9.泛型 map.entrySet() :取出map集合的键值对组成一个set集合. ...
- Tomcat jsp页面显示有问题
1.干掉tomcat下的work文件夹里面的东西,让jsp文件重新编译,相当于清楚缓存 2.work 里面是 jsp 编译的类 ,只要jsp 被访问了,就会被编译,就会生成相应的类 3.tomcat下 ...
- linux中tomcat启动脚本:关闭、发布、重启、测试是否成功
说明 在使用jenkins持续集成时,需要实现自动发布包到tomcat.该脚本实现了在jenkins将包发送到linux服务器上后的自动关闭.发布.启动.测试启动是否成功的过程 思路 该思路以tomc ...
- elasticsearch重建索引
1.重建索引 一个field的设置是不能被修改的,如果要修改一个Field,那么应该重新按照新的mapping,建立一个index,然后将数据批量查询出来,重新用bulk api写入index中 批量 ...
- Day 18 hashlib,logging模块
hashlib 模块 作用:hash是一种算法,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法,该算法接受传入的内容,经过运算得到一串hash值 特点: 1.只要 ...
- 三种办法来安装Python3.x
Centos7默认自带了Python2.7版本,但是因为项目需要使用Python3.x你可以按照此文的三个方法进行安装. 注:本文示例安装版本为Python3.5, 一.Python源代码编译安装 安 ...