题目: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 ;
}

最新文章

  1. java基础_集合List与Set接口
  2. Ubuntu下git的安装与使用
  3. UGUI 学习笔记
  4. eclipse android工程没有错却出现红叉
  5. oracle通过修改控制文件scn推进数据库scn
  6. ASP.NET ashx实现无刷新页面生成验证码
  7. DP:教授逻辑学问题
  8. Ubuntu gcc编译报错:format ‘%llu’ expects argument of type ‘long long unsigned int’, but argument 2 has type ‘__time_t’ [-Wformat=]
  9. Sum All Odd Fibonacci Numbers
  10. ueditor .net版本上传不了图片问题
  11. [转]LUA C 互调
  12. [物理学与PDEs]第1章习题参考解答
  13. throttle/debounce: 为你的cpu减减压(前端性能优化)
  14. 【python基础】 Tkinter 之 几何管理器
  15. &lt;script src=&quot;xxx.php&quot;&gt;&lt;/script&gt;
  16. yk-随记
  17. python+selenium+xpath 爬取天眼查工商基本信息
  18. python 文件处理(转载)
  19. Ubuntu中创建、删除、更改、移动文件的命令
  20. iOS UITextView 设置 NSLinkAttributeName 属性,点击链接跳转

热门文章

  1. Ubuntu启动自动登录并启动程序
  2. PHP 最大化资源配置 Resource Limits 错误两则
  3. 七 、linux正则表达式
  4. Linux文件系统十问---深入理解文件存储方式(rhel6.5,EXT4)【转】
  5. yum 源配置
  6. inline-block和同级的text-align问题
  7. 和BEM的战斗:10个常见问题及如何避免
  8. hdu 5890 Eighty seven 暴力+bitset优化背包
  9. Codeforces Round #304 (Div. 2) D. Soldier and Number Game 素数打表+质因数分解
  10. Spring Cloud实战微服务入门