和倍增法求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. MVVMLight Messenging

    Basically there are two possible ways to send a message, first using an overload of the RaisePropert ...

  2. 使用swf与swc引入资源的区别[as3]

    SWF用于运行时加载,而SWC在编译时用做外部库.使用SWC库,只有当类被引用,才编译入主程序中. getDefinition: 在使用swc库方式引入资源时,getDefinitionByName反 ...

  3. 处理海量数据的高级排序之——堆排序(C++)

    在面对大数据量的排序时(100W以上量级数据),通常用以下三种的排序方法效率最高O(nlogn):快速排序.归并排序,堆排序.在这个量级上,其他冒泡,选择,插入等简单排序已经无法胜任,效率极低,跟前面 ...

  4. intellij idea 插件 ideaVim

    像Eclipse一样,idea这个公认最好的javaIDE也有Vim插件. 安装方法 File>Settings>Plugins>Install JetBrains plugin.. ...

  5. IE 9 以下兼容HTML5

    <head> <meta name="viewport" content="width=device-width,initial-scale=1.0&q ...

  6. 示例说明Oracle RMAN两种库增量备份的差别

    1差异增量实验示例 1.1差异增量备份 为了演示增量备份的效果,我们在执行一次0级别的备份后,对数据库进行一些改变. 再执行一次1级别的差异增量备份: 执行完1级别的备份后再次对数据库进行更改: 再执 ...

  7. SPFA导读及介绍(转载)

    适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...

  8. bug1

    1从相册中获取图片,低版本可以,高版本不行.看见抛出 Bitmap too large to be uploaded into a texture 原来是高版本的android,机子好点,相机就好点, ...

  9. SpringMVC下的Shiro权限框架的使用

    SpringMVC+Shiro权限管理 博文目录 权限的简单描述 实例表结构及内容及POJO Shiro-pom.xml Shiro-web.xml Shiro-MyShiro-权限认证,登录认证层 ...

  10. BizTalk开发系列(七) Hello World2

    之前根据BizTalk的订阅原理,使用BizTalk管理控制台创建了第一个应用程序 Hello World.但是由于控制台的开发功能有限,绝大多数的BizTalk程序都是在集成开发环境Visual S ...