bzoj1977(未写完题解)
来源:互联网 发布:硬盘录像机端口 编辑:程序博客网 时间:2024/05/17 16:03
调了那么久就是因为
pro=max(pro,sec(ans1,fmax[u][0],fmax[v][0]));//shunxu!!! ans1=max(ans1,max(fmax[u][0],fmax[v][0])); ans2=max(ans2,max(smax[u][0],smax[v][0])); ans2=max(pro,ans2);
最后一步pro的语序错了
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define ll long longconst int M=300000+5,N=100000+5,P=16;int fa[N],nxt[M],to[M],head[N],w[M],etot;bool exi[M];int fmax[N][P+1],smax[N][P+1],anc[N][P+1],dep[N];struct edge{ int u,v,w;}e[M];int sec(int a,int b,int c){ if((a<=b&&a>=c)||(a>=b&&a<=c)) return a; if((b<=c&&b>=a)||(b<=a&&b>=c)) return b; if((c<=a&&c>=b)||(c<=b&&c>=a)) return c; }void adde(int u,int v,int c){ to[++etot]=v; w[etot]=c; nxt[etot]=head[u]; head[u]=etot;}int cmp(edge a,edge b){ return a.w<b.w;}int getfa(int x){ return fa[x]==x?x:fa[x]=getfa(fa[x]);}void merge(int u,int v){ int pa=getfa(u),pb=getfa(v); fa[pa]=pb;}void dfs(int u,int fa){ dep[u]=dep[fa]+1; anc[u][0]=fa; for(int p=1;p<=P;p++){ anc[u][p]=anc[anc[u][p-1]][p-1]; fmax[u][p]=max(fmax[u][p-1],fmax[anc[u][p-1]][p-1]); smax[u][p]=max(max(smax[u][p-1],smax[anc[u][p-1]][p-1]),min(fmax[u][p-1],fmax[anc[u][p-1]][p-1])); } for(int i=head[u];i;i=nxt[i]){ int v=to[i]; if(v==fa) continue; fmax[v][0]=w[i]; smax[v][0]=-1; dfs(v,u); }}void query(int u,int v,int &ans1,int &ans2){ int pro=-1; if(dep[u]<dep[v]) swap(u,v); int t=dep[u]-dep[v]; for(int p=0;t;t>>=1,p++) if(t&1){ ans1=max(ans1,fmax[u][p]); ans2=max(ans2,smax[u][p]); u=anc[u][p];//shunxu!! } if(u==v) return; for(int p=P;p>=0;p--) if(anc[u][p]!=anc[v][p]) { pro=max(pro,sec(ans1,fmax[u][p],fmax[v][p])); ans1=max(ans1,max(fmax[u][p],fmax[v][p])); ans2=max(ans2,max(smax[u][p],smax[v][p])); u=anc[u][p],v=anc[v][p]; } //沿途再求一个fmax的第二 和smax的第一相比 pro=max(pro,sec(ans1,fmax[u][0],fmax[v][0]));//shunxu!!! ans1=max(ans1,max(fmax[u][0],fmax[v][0])); ans2=max(ans2,max(smax[u][0],smax[v][0])); ans2=max(pro,ans2);}int main(){ int n,m; int tot=0;ll val=0; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w); sort(e+1,e+1+m,cmp); for(int i=1;i<=m;i++){ if(getfa(e[i].u)!=getfa(e[i].v)){ adde(e[i].u,e[i].v,e[i].w); adde(e[i].v,e[i].u,e[i].w); exi[i]=1; merge(e[i].u,e[i].v); val=val+1ll*e[i].w; if(++tot==n-1) break; } }// printf("val:%I64d\n",val); dfs(1,1); int del=1e9; for(int i=1;i<=m;i++) if(!exi[i]){ int fans=-1,sans=-1; query(e[i].u,e[i].v,fans,sans); if(fans!=e[i].w) del=min(del,e[i].w-fans); if(sans!=e[i].w&&sans!=-1) del=min(del,e[i].w-sans); } val=val+del; printf("%lld",val);//bzoj lld return 0;}
阅读全文
0 0
- bzoj1977(未写完题解)
- 未写完。。。。
- 12-15-2014-集合(未写完)
- 未写完题目(待改进)?!
- 数据库复习总结(未写完...)
- IAR调试错误总结(未写完)
- 网络工程师必备知识(未写完)
- Spring知识点总结(未写完)
- 一些练习题,未写完
- 注册 未写完!
- 未写完的题
- 【未写完】安全总结
- (6)Cocos2D-x中的核心类(未写完)
- 设计模式经典国产文章(但未写完)
- (未写完)Zookeeper学习(六):利用Zookeeper实现配置管理
- 稀疏矩阵乘法【未写完】
- 温故而知新(六)Java基础:IO流(此文章暂时未写完)
- 在华师学习时的一些感触(未写完只列了标题)
- CodeForces 864B Polycarp and Letters
- Linux Unit2--Linux系统结构
- vs无法打开文件“glut32“解决方案
- BZOJ 3712 Fiolki (倍增LCA)
- ZUFE 2485
- bzoj1977(未写完题解)
- js实现多选框的全选/全不选
- 关于创业公司和技术Leader的一些感想
- git设置用户名密码
- java线程的状态
- Android 6.0自定义文本选择菜单简单使用
- Data_gard搭建
- 移动设备电池管理——各种电池技术的简介1
- 终于弄明白了的结构体与typedef的使用,还有结构体指针的使用(二层结构体指针)