题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1977

kruscal别忘了先按边权sort。自己觉得那部分处理得还挺好的。(联想到之前某题的经验)

没管重边。好像还行?

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e5+,M=3e5+,Lm=,INF=1e9+;
int n,m,head[N],xnt=,pre[N][Lm+],mx[N][Lm+][];
int fa[N],dis[N],fr[N],dep[N];
ll ans,zl;
bool vis[N],use[M<<];
struct Ed{
int next,fr,to,w,bh;
Ed(int n=,int f=,int t=,int w=):next(n),fr(f),to(t),w(w) {}
bool operator< (const Ed &b)const
{return bh<b.bh;}
}ed[M<<];
void add(int x,int y,int z)
{
ed[++xnt]=Ed(head[x],x,y,z);head[x]=xnt;ed[xnt].bh=xnt;
ed[++xnt]=Ed(head[y],y,x,z);head[y]=xnt;ed[xnt].bh=xnt;
}
int find(int a){return fa[a]==a?a:fa[a]=find(fa[a]);}
bool cmp(Ed u,Ed v){return u.w<v.w;}
void kruscal()
{
sort(ed+,ed+xnt+,cmp);////////
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=xnt;i++)
if(find(ed[i].fr)!=find(ed[i].to))
{
use[ed[i].bh]=;ans+=ed[i].w;
fa[find(ed[i].fr)]=find(ed[i].to);
}
sort(ed+,ed+xnt+);//为了^1
for(int i=;i<=xnt;i++)if(use[i])use[i^]=;
}
void dfs(int cr,int r)
{
pre[cr][]=ed[r].fr;mx[cr][][]=ed[r].w;dep[cr]=dep[ed[r].fr]+;
for(int i=;i<=Lm;i++)
{
int k=pre[cr][i-];if(!pre[k][i-])break;
pre[cr][i]=pre[k][i-];
mx[cr][i][]=max(mx[cr][i-][],mx[k][i-][]);
mx[cr][i][]=max(mx[cr][i-][],mx[k][i-][]);
if(mx[cr][i-][]<mx[cr][i][])mx[cr][i][]=max(mx[cr][i][],mx[cr][i-][]);
if(mx[k][i-][]<mx[cr][i][])mx[cr][i][]=max(mx[cr][i][],mx[k][i-][]);
}
for(int i=head[cr];i;i=ed[i].next)
if(use[i]&&i!=(r^)/*&&!pre[ed[i].to][0]*/)dfs(ed[i].to,i);
}
void cz(int &w0,int &w1,int x,int i)
{
int tmp=w0;
w0=max(w0,mx[x][i][]);w1=max(w1,mx[x][i][]);
if(tmp<w0)w1=max(w1,tmp);
else if(mx[x][i][]!=w0)w1=max(w1,mx[x][i][]);//严格次大
}
void solve(int x,int y,int &w0,int &w1)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=Lm;i>=;i--)
if(dep[pre[x][i]]>=dep[y])
cz(w0,w1,x,i),x=pre[x][i];
if(x==y)return;
for(int i=Lm;i>=;i--)
if(pre[x][i]!=pre[y][i])
{
cz(w0,w1,x,i);cz(w0,w1,y,i);
x=pre[x][i];y=pre[y][i];
}
if(x!=y)
{
cz(w0,w1,x,);cz(w0,w1,y,);
x=pre[x][];y=pre[y][];
}
}
int main()
{
scanf("%d%d",&n,&m);int x,y,z;
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);add(x,y,z);
}
kruscal();
dfs(,);zl=INF;
for(int i=;i<=xnt;i+=)
if(!use[i])
{
int w0=-,w1=-;
solve(ed[i].fr,ed[i].to,w0,w1);
if(ed[i].w>w0)zl=min(zl,(ll)ed[i].w-w0);
else if(ed[i].w>w1)zl=min(zl,(ll)ed[i].w-w1);
}
printf("%lld",ans+zl);
return ;
}

bzoj 1977 [BeiJing2010组队]次小生成树 Tree的更多相关文章

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

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

  2. BZOJ 1977[BeiJing2010组队]次小生成树 Tree - 生成树

    描述: 就是求一个次小生成树的边权和 传送门 题解 我们先构造一个最小生成树, 把树上的边记录下来. 然后再枚举每条非树边(u, v, val),在树上找出u 到v 路径上的最小边$g_0$ 和 严格 ...

  3. 【刷题】BZOJ 1977 [BeiJing2010组队]次小生成树 Tree

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

  4. BZOJ 1977: [BeiJing2010组队]次小生成树 Tree 倍增 最小生成树

    好吧我太菜了又调了一晚上...QAQ 先跑出最小生成树,标记树边,再用树上倍增的思路,预处理出: f[u][i] :距离u为2^i的祖先 h[u][i][0/1] :距u点在2^i范围内的最长边和次长 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. php数组函数-array_combine()

    array_combine()函数通过合并两个数组来创建一个新数组,其中一个数组是键名,另一个数组的值为键值. 如果其中一个数组为空,或者两个数组的元素个数不同,则该函数返回 false. array ...

  2. mongodb count 导致不正确的数量(mongodb count 一个坑)

    在mongodb 集群中,if  存在orphaned documents 和chunk migration, count查询可能会导致一个不正确的查询结果,例如我就是踩的这个坑,先不说话,看结果: ...

  3. MySQLdump导出sql脚本

    1.问题描述 通过图形化工具,在查询窗口用select语句按条件查询出所需结果,然后用“导出向导”把查询结果导成sql文件,但是导出来的sql语句不全,没有表名.字段名. 通过图形化工具,试了好多次都 ...

  4. 异常:没有找到本地方法库,java.lang.UnsatisfiedLinkError: no trsbean in java.library.path

    1.问题描述 迁移环境中遇到这个问题 : Fri Apr 20 15:22:31 CST 2018, Exception:500004___-500004,没有找到本地方法库,java.lang.Un ...

  5. mysql中两表更新时产生的奇葩问题,产生死锁!

    如下一个两表更新语句 UPDATE hzxm201610 a,xmhzylb1201610 b SET a.gk07_1_6=b.gk04_11,a.gk07_2_6=b.f06_1,a.gk07_3 ...

  6. 不小心把服务器上的/usr/lib下的所有文件删除,恢复办法

    手贱,使用root用户,rm -rf 多了一个"*"……导致了万分惊恐的悲剧,/usr/lib下的所有文件被删除…… 修复办法: linux系统是基于文件的,所以只要能拷贝到和原来 ...

  7. DB2导入导出方法总结

    1.导出 DEL 文本文件  export to D:\T_TESTTABLE20121220.del of del select * from T_TESTTABLE 2.导出 ixf 文本文件.i ...

  8. 一个简单客户端获取IP,国家,城市,省份的代码

    <html><head>  <script src="js/jquery-1.6.2.min.js" type="text/javascri ...

  9. hdu 5244 inverse(分治¥)

    inverse Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  10. Mysql ERROR 145 (HY000)

    问题:今天Mysql数据库异常关闭,起来之后感觉可以了. 但是运行业务数据的时间就类似如下的错误 ERROR 145 (HY000) at line 34: Table './database_nam ...