和倍增法求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. Find和FirstOrDefault()有什么区别?

    Find方法和FirstOrDefault方法效果相同,都是返回满足条件的第一个元素,如果没有该元素,则返回null. 那么这两个扩展方法有什么不同? 1)Find方法是.netFramework2. ...

  2. iOS 自动布局小结

    1> sizeclasses 可以限制某个 storyboard 显示在什么样的屏幕上,如 当前 storyboard 在iPhone 的左斜右斜或 iPad上是否显示.. 2> Hug值 ...

  3. linux文件创建、查看、编辑命令

    一.创建文件命令 1.touch命令 linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件.touch   [-acm][-r   ref ...

  4. Hadoop_简单操作ZooKeeper

    一.概念 1. 一个开源的.分布式的,为分布式应用提供协调服务的Apache项目 2. 提供一个简单的原语集合,以便于分布式应用可以在它之上构建更高层次的同步服务 3. 设计非常易于编程,它使用的是类 ...

  5. zk listbox 点击列标题实现排序功能

    前台(test.zul): <?page title="测试" contentType="text/html;charset=UTF-8"?> &l ...

  6. Oracle登录操作系统验证和密码文件验证

    1.确认数据库版本 2.查看当前配置文件 ORALCE数据库不同的登录验证方式是和SQLNET.ORA配置文件有关系的,在配置文件中有一个参数sqlnet.authentication_service ...

  7. JSTL 核心标签库 使用(C标签)

    JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.otherwise 3.循环标签:f ...

  8. LaTex 数学公式

    \usepackage{amsmath} 常用宏包 \usepackage{arydshln} 此宏包带虚线 $ $ 行内公式 $$ $$ 行间公式 \[ \] 行间公式 \numberwithin{ ...

  9. dom4j解析xml文档&保存数据的乱码问题

    package itcast.dom4j; import java.io.File; import java.io.FileOutputStream; import java.io.FileWrite ...

  10. Apache按日切分日志

    apache按日切分日志,使用apache自带的rotatelogs切分 语法: rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ fi ...