bzoj1977 [BeiJing2010组队]次小生成树 Tree
和倍增法求lca差不多,维护每个点往上跳2^i步能到达的点,以及之间的边的最大值和次大值,先求出最小生成树,对于每个非树边枚举其端点在树上的路径的最大值,如果最大值和非树边权值一样则找次大值,然后维护答案即可。
代码
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = ;
const int M = ;
const int inf = ;
int f[N],n,m,i;
int dp,p[N],pre[M],tt[M],ww[M],flag[M];
int deep[N],jump[N][],mi[N][],Mi[N][];
long long ans,Ans;
struct g{
int l,r,v;
}a[M];
void link(int x,int y,int z)
{
dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;ww[dp]=z;
}
bool cmp(g a,g b)
{
return a.v<b.v;
}
int gf(int x)
{
while (x!=f[x]) x=f[x];return x;
}
void dfs(int x,int fa,int va)
{
deep[x]=deep[fa]+;
jump[x][]=fa;
mi[x][]=va;
Mi[x][]=-inf;
int i;
for (i=;i<=;i++)
{
jump[x][i]=jump[jump[x][i-]][i-];
mi[x][i]=max(mi[x][i-],mi[jump[x][i-]][i-]);
if (mi[x][i-]==mi[jump[x][i-]][i-])
Mi[x][i]=max(Mi[x][i-],Mi[jump[x][i-]][i-]);
else
if (mi[x][i-]<mi[jump[x][i-]][i-])
Mi[x][i]=max(mi[x][i-],Mi[jump[x][i-]][i-]);
else
Mi[x][i]=max(Mi[x][i-],mi[jump[x][i-]][i-]);
}
i=p[x];
while (i)
{
if (tt[i]!=fa)
dfs(tt[i],x,ww[i]);
i=pre[i];
}
}
void updata(int x,int y,int &ans,int &Ans)
{
if (x>=ans)
{
if (x>ans)
Ans=max(Ans,ans);
Ans=max(Ans,y);
ans=x;
}
else
if (x>Ans)
Ans=max(Ans,x);
}
int get(int a,int b,int c)
{
if (deep[a]<deep[b]) a^=b^=a^=b;
int i,ans=-inf,Ans=-inf;
for (i=;i>=;i--)
if (deep[jump[a][i]]>=deep[b])
{
updata(mi[a][i],Mi[a][i],ans,Ans);
a=jump[a][i];
}
if (a==b)
{
if (ans==c) return Ans;else return ans;
}
for (i=;i>=;i--)
if (jump[a][i]!=jump[b][i])
{
updata(mi[a][i],Mi[a][i],ans,Ans);
updata(mi[b][i],Mi[b][i],ans,Ans);
a=jump[a][i];b=jump[b][i];
}
updata(mi[a][],Mi[a][],ans,Ans);
updata(mi[b][],Mi[b][],ans,Ans);
if (ans==c) return Ans;else return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for (i=;i<=m;i++)
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].v);
sort(a+,a++m,cmp);
for (i=;i<=n;i++) f[i]=i;
for (i=;i<=m;i++)
{
int l=a[i].l,r=a[i].r;
if (gf(l)!=gf(r))
{
link(l,r,a[i].v);
link(r,l,a[i].v);
f[gf(l)]=gf(r);
Ans+=a[i].v;
flag[i]=;
}
}
dfs(,,);
ans=(long long) inf*inf;
for (i=;i<=m;i++)
if (!flag[i])
{
long long tmp=Ans-get(a[i].l,a[i].r,a[i].v)+a[i].v;
if ((tmp>Ans)&&(tmp<ans)) ans=tmp;
}
printf("%lld\n",ans);
}
bzoj1977 [BeiJing2010组队]次小生成树 Tree的更多相关文章
- 【次小生成树】bzoj1977 [BeiJing2010组队]次小生成树 Tree
Description 小 C 最近学了很多最小生成树的算法,Prim 算法.Kurskal 算法.消圈算法等等. 正当小 C 洋洋得意之时,小 P 又来泼小 C 冷水了.小 P 说,让小 C 求出一 ...
- [bzoj1977][BeiJing2010组队]次小生成树 Tree——树上倍增+lca
Brief Description 求一个无向图的严格次小生成树. Algorithm Design 考察最小生成树的生成过程.对于一个非树边而言,如果我们使用这一条非树边去替换原MST的路径上的最大 ...
- bzoj1977 [BeiJing2010组队]次小生成树 Tree——严格次小生成树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1977 因为严格,所以要记录到 LCA 的一个次小值: 很快写好,然后改掉一堆错误后终于过了样 ...
- 【BZOJ1977】[BeiJing2010组队]次小生成树 Tree 最小生成树+倍增
[BZOJ1977][BeiJing2010组队]次小生成树 Tree Description 小 C 最近学了很多最小生成树的算法,Prim 算法.Kurskal 算法.消圈算法等等. 正当小 C ...
- BZOJ 1977: [BeiJing2010组队]次小生成树 Tree( MST + 树链剖分 + RMQ )
做一次MST, 枚举不在最小生成树上的每一条边(u,v), 然后加上这条边, 删掉(u,v)上的最大边(或严格次大边), 更新答案. 树链剖分然后ST维护最大值和严格次大值..倍增也是可以的... - ...
- 1977: [BeiJing2010组队]次小生成树 Tree
1977: [BeiJing2010组队]次小生成树 Tree https://lydsy.com/JudgeOnline/problem.php?id=1977 题意: 求严格次小生成树,即边权和不 ...
- [BeiJing2010组队]次小生成树 Tree
1977: [BeiJing2010组队]次小生成树 Tree Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 5168 Solved: 1668[S ...
- 【bzoj1977】[BeiJing2010组队]次小生成树 Tree 最小生成树+权值线段树合并
题目描述 求一张图的严格次小生成树的边权和,保证存在. 输入 第一行包含两个整数N 和M,表示无向图的点数与边数. 接下来 M行,每行 3个数x y z 表示,点 x 和点y之间有一条边,边的权值为z ...
- 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
随机推荐
- BZOJ4551: [Tjoi2016&Heoi2016]树
Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标 ...
- C++的STL中vector内存分配方法的简单探索
STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux CentOS 5.2 1.代码 #include <vector> #include <stdio ...
- MyBatis调用存储过程,含有返回结果集、return参数和output参数
Ibatis是我们经常使用的O/R映射框架,mybats是ibatis被Google收购后重新命名的一个工程,当然也做了大量的升级.而调用存储过程也是一次额C/S架构模式下经常使用的手段,我们知道,i ...
- jQ处理页面中尺寸过大的图片
这是一个非常实用的功能,在网页里难免会出现一些尺寸过大的图片,会将页面撑开或者图片被部分隐藏,我们通常会用css的max-width来加以 控制,但ie6却不吃这套.我在做一个站时,就遇到这种困惑,因 ...
- ubuntu安装Lua
1.网站下载LUA包 curl -R -O http://www.lua.org/ftp/lua-5.2.3.tar.gz 2.下载ubuntu的编译支持sudo apt-get install bu ...
- Point Grey articles link
Point Grey areaDetector driver Bumblebee XB3 Specifications FlyCapture SDK Example Source Code Under ...
- Tree树形结构案例+源码
上次用到Tree结构,自己不知道写,就在网上找了几个相对较好的tree小案例,留着自己用,希望也能帮到你 下面是案例的一些图片,压缩文件已近上传至博客当和百度云中. 下载链接:http://pan.b ...
- FIO 测试磁盘iops 以及读写
最近在做mariadb的性能,感觉io 有瓶颈,就使用fio 来测试一下磁盘.下文为转载文章(温馨提示:此命令很伤硬盘,测试前请备份数据,- -我就写坏了一个.) FIO 是测试IOPS的非常好的工具 ...
- html代码中的form参数是基本一致的
由于pear的大多数模块仍处于开发当中,因此,这里列举的是随着php4.05一起发布的pear中的模块,需要注意的是,一些抽象类或者是基类(如mail.php,log.php,cache.php)没有 ...
- freemarker判断对象是否为空
freemarker中显示某对象使用 ${name}. 但如果name为null,freemarker就会报错.如果需要判断对象是否为空: <#if name??> …… </# ...