博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
严格次小生成树[BJWC2010]
阅读量:4664 次
发布时间:2019-06-09

本文共 3500 字,大约阅读时间需要 11 分钟。

维护环内最大值与严格次大值

与未放入最小生成树的边枚举加入

#include
#define re return#define dec(i,l,r) for(ll i=l;i>=r;--i)#define inc(i,l,r) for(ll i=l;i<=r;++i)typedef long long ll;using namespace std;template
inline void rd(T&x){ char c;bool f=0; while((c=getchar())<'0'||c>'9')if(c=='-')f=1; x=c^48; while((c=getchar())>='0'&&c<='9')x=x*10+(c^48); if(f)x=-x;}const int maxn=100005,maxm=300005;ll n,m,k=1,hd[maxn],deep[maxn];ll max1[maxn][21],max2[maxn][21],fa[maxn][21];ll vis[maxm],f[maxn];ll sum,ans=999999999999999999;struct node{ ll fr,to,nt,val; bool operator<(node p)const { re val
max1[fa[x][i]][i]) { max1[x][i+1]=max1[x][i]; max2[x][i+1]=max(max1[fa[x][i]][i],max2[x][i]); } else { max1[x][i+1]=max1[fa[x][i]][i]; max2[x][i+1]=max(max1[x][i],max2[fa[x][i]][i]); } } for(ll i=hd[x];i;i=e1[i].nt) { ll v=e1[i].to; if(v==fa[x][0])continue; fa[v][0]=x; max1[v][0]=e1[i].val; max2[v][0]=-2147483647; dfs(v); }}inline ll find(ll x){ re x==f[x]?x:f[x]=find(f[x]);}int main(){ // freopen("in.txt","r",stdin);freopen("tree8.in","r",stdin); ll x,y,z; rd(n),rd(m); inc(i,1,n)f[i]=i; inc(i,1,m) { rd(x),rd(y),rd(z); e[i]=(node){x,y,0,z}; } sort(e+1,e+m+1); k=0; ll cnt=0; inc(i,1,m) { x=find(e[i].to),y=find(e[i].fr); if(x!=y) { add1(e[i].to,e[i].fr,e[i].val); sum+=e[i].val; vis[i]=1; f[x]=y; ++cnt; if(cnt==n-1)break; } } dfs(1); inc(j,1,m) if(!vis[j]) { x=e[j].to;y=e[j].fr;//-------------------------------------------------------------------------------- ll d1=0,d2=0; if(deep[x]
=deep[y]) { if(max1[x][i]>d1) { d2=max(d1,max2[x][i]); d1=max1[x][i]; } else if(max1[x][i]!=d1) d2=max(d2,max1[x][i]); x=fa[x][i]; } if(x!=y) { dec(i,20,0) if(fa[x][i]!=fa[y][i]) { if(max1[x][i]>d1) { d2=max(d1,max2[x][i]); d1=max1[x][i]; } else if(max1[x][i]!=d1) d2=max(d2,max1[x][i]); if(max1[y][i]>d1) { d2=max(d1,max2[y][i]); d1=max1[y][i]; } else if(max1[y][i]!=d1) d2=max(d2,max1[y][i]); x=fa[x][i];y=fa[y][i]; } if(max1[x][0]>d1) { d2=d1; d1=max1[x][0]; } else if(max1[x][0]!=d1) d2=max(d2,max1[x][0]); if(max1[y][0]>d1) { d2=d1; d1=max1[y][0]; } else if(max1[y][0]!=d1) d2=max(d2,max1[y][0]); } //----------------------------------------------------------------------------------------------------- if(d1==e[j].val)ans=min(ans,sum+e[j].val-d2); else ans=min(ans,sum+e[j].val-d1); } printf("%lld",ans); re 0;}

 

转载于:https://www.cnblogs.com/lsyyy/p/11417366.html

你可能感兴趣的文章
edge box
查看>>
eetcode 之String to Integer (atoi)(28)
查看>>
bolt_storage.go
查看>>
LeetCode--026--删除排序数组中的重复项(java)
查看>>
【HANA系列】SAP 【第二篇】EXCEL连接SAP HANA的方法(ODBC)
查看>>
【ABAP系列】SAP ABAP OOALV 动态设置单元格可否编辑
查看>>
Js 中 getYear() 和 getFullYear() 的区别
查看>>
使用NPM在项目中引入【lodash】
查看>>
富文本,KindEditor的使用方法及(jsp)案例
查看>>
(转)水波纹过渡特效
查看>>
CSS学习笔记
查看>>
Spring Boot 警告: ApplicationContext is unlikely to ...... the default package
查看>>
2017 3 8 练习赛 t3 路径规划
查看>>
125. Valid Palindrome
查看>>
tp 30秒超时
查看>>
11、生成带参数二维码应用场景
查看>>
随机发红包
查看>>
AutoIT:界面与自动化操作结合来简化日常劳动: .Net Reactor验证License,设置License,创建License,截图AutoIt自动化实现。(四)...
查看>>
python 一些方法函数
查看>>
jquery之cookie操作
查看>>