和倍增法求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的更多相关文章

  1. 【次小生成树】bzoj1977 [BeiJing2010组队]次小生成树 Tree

    Description 小 C 最近学了很多最小生成树的算法,Prim 算法.Kurskal 算法.消圈算法等等. 正当小 C 洋洋得意之时,小 P 又来泼小 C 冷水了.小 P 说,让小 C 求出一 ...

  2. [bzoj1977][BeiJing2010组队]次小生成树 Tree——树上倍增+lca

    Brief Description 求一个无向图的严格次小生成树. Algorithm Design 考察最小生成树的生成过程.对于一个非树边而言,如果我们使用这一条非树边去替换原MST的路径上的最大 ...

  3. bzoj1977 [BeiJing2010组队]次小生成树 Tree——严格次小生成树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1977 因为严格,所以要记录到 LCA 的一个次小值: 很快写好,然后改掉一堆错误后终于过了样 ...

  4. 【BZOJ1977】[BeiJing2010组队]次小生成树 Tree 最小生成树+倍增

    [BZOJ1977][BeiJing2010组队]次小生成树 Tree Description 小 C 最近学了很多最小生成树的算法,Prim 算法.Kurskal 算法.消圈算法等等. 正当小 C ...

  5. BZOJ 1977: [BeiJing2010组队]次小生成树 Tree( MST + 树链剖分 + RMQ )

    做一次MST, 枚举不在最小生成树上的每一条边(u,v), 然后加上这条边, 删掉(u,v)上的最大边(或严格次大边), 更新答案. 树链剖分然后ST维护最大值和严格次大值..倍增也是可以的... - ...

  6. 1977: [BeiJing2010组队]次小生成树 Tree

    1977: [BeiJing2010组队]次小生成树 Tree https://lydsy.com/JudgeOnline/problem.php?id=1977 题意: 求严格次小生成树,即边权和不 ...

  7. [BeiJing2010组队]次小生成树 Tree

    1977: [BeiJing2010组队]次小生成树 Tree Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 5168  Solved: 1668[S ...

  8. 【bzoj1977】[BeiJing2010组队]次小生成树 Tree 最小生成树+权值线段树合并

    题目描述 求一张图的严格次小生成树的边权和,保证存在. 输入 第一行包含两个整数N 和M,表示无向图的点数与边数. 接下来 M行,每行 3个数x y z 表示,点 x 和点y之间有一条边,边的权值为z ...

  9. 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

随机推荐

  1. C#图片处理---基础

    简单的图片剪裁 using System; using System.Drawing; using System.Drawing.Drawing2D; using System.IO; namespa ...

  2. 使用Uboot启动内核并挂载NFS根文件系统

    配置编译好内核之后,将生成的内核文件uImage拷贝到/tftpboot/下,通过tftp服务器将内核下载到开发板,使用命令:tftp 31000000 uImage.下载完成之后配置bootargs ...

  3. Common Subsequence LCS

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730#problem/F 题目: Description A subsequ ...

  4. Vue.js基本规则提炼总结及计算属性学习

    Vue.js基本须知: 1)以“{{}}”格式 “Mustache” 语法(双大括号)来绑定表达式输出文本值; 2)以“{{{}}}”格式绑定原始的html,绑定的表达式内为字符串格式的html内容, ...

  5. div半透明背景,文字不透明

    background: rgba(255, 255, 255, 0.8) !important; /* IE无效,FF有效 */ background: #fff; filter: alpha(opa ...

  6. 20个有用的jq弹窗

    链接地址:http://www.ffpic.com/zixun/20-useful-jquery-modal-plugins.html 推荐:jQuery.bPopup.js

  7. Spring.Net 配置文件

    方法一. 直接在程序配置文件中配置 <configuration> <configSections> <sectionGroup name="spring&qu ...

  8. Bootstrap Chart组件使用分享

    图表组件Chart.js是Bootstrap比较好用的组件之一,与一款收费的组件highchart类似,效果上来看免费与收费的产品相差还是有一点点的,不过功能上差不多能满足我们项目的需要.下面这段JS ...

  9. 如何在maven工程中加载oracle驱动

    maven中引入oracle驱动报错Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0 时间:2015年09月22日  浏览:9361次 在maven ...

  10. IOS第18天(10,核心动画-转盘,自定义buton,旋转动画)

    *****HMViewController.m #import "HMViewController.h" #import "HMWheelView.h" @in ...