今天说是要练习LCA结果找了道题看着题解打完了,如此惭愧,Lca还得好好理解啊,感觉在最大生成树上做有点异样,可能还是不是很理解吧,在noip前一定要再把这道题再a一遍,好题啊。

这是2013noipt3的题,难度适中,比以往的简单没让人想不出来思路虽然我第一遍看也没想起来但是题解易懂,是我这种低级选手能做的题,所以今天下午选择做这道题,看着题解打了3h终于大功告成,一部分是抄的真心不会啊lca,昨天刚学还是打不下了。打完代码后按了下F7,嗯,100+errors真的很难受,代码能力过差,然后调试调了30多分钟,各种i打成j各种w打成fa,真的是醉了,按照汤神的话来说就是打代码的时候你在想什么,汤神看代码很准的基本上没什么错误orztql,于是乎和上一遍lca并不一样的不在于求最大生成树(这个非常好打)而是定根节点,要不这个最大的生成树可以看成一条线,如果不定根节点的话,谁知道你的最近公共祖先是谁,然后就是倍数的问题二进制的拆分,直接从20开始不必log(n)/log(i);因为n不可能超过2的20次方,尽管这样浪费一点时间,但是无关紧要,还有就是一点不是很理解的就是lca的初始化不是很懂啊,尽管明白那是个状态转移,但是呢打起来的时候还是迷茫,不理解内层因为i是从20开始的,于是乎到达很大的i的时候那时的祖先都是已经达到的祖先了这些都其实没什么用,还是写篇博客更好,又加深了理解,很棒呢!

下面是代码了接近150行代码=-= 好累。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<ctime>
#include<map>
#include<vector>
#include<stack>
#define inf 10000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int maxn=;
struct bwy
{
int x,y,dis;
}s[maxn];
int e[maxn],nex[maxn],lin[maxn],ver[maxn],len;
int f[maxn],fa[maxn][],w[maxn][],depth[maxn],vis[maxn];
void add(int x,int y,int z)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
e[len]=z;
}
int n,m,k;
int my(bwy x,bwy y)
{
return x.dis>y.dis;
}
int getfather(int x)
{
if(x==f[x])
return x;
return f[x]=getfather(f[x]);
}
void kruskal()
{
for(int i=;i<=n;i++)
f[i]=i;
sort(s+,s++m,my);
for(int i=;i<=m;i++)
{
int xx=getfather(s[i].x);
int yy=getfather(s[i].y);
if(xx!=yy)
{
f[xx]=yy;
add(s[i].x,s[i].y,s[i].dis);
add(s[i].y,s[i].x,s[i].dis);
}
}
}
void dfs(int num)
{
vis[num]=;
for(int i=lin[num];i!=;i=nex[i])
{
int tn=ver[i];
if(vis[tn]==)
continue;
depth[tn]=depth[num]+;
fa[tn][]=num;
w[tn][]=e[i];
dfs(tn);
}
return;
}
int lca(int x,int y)
{
if(getfather(x)!=getfather(y))
return -;
int ans=inf;
if(depth[x]>depth[y])
swap(x,y);
for(int i=;i>=;i--)
{
if(depth[fa[y][i]]>=depth[x])
{
ans=min(ans,w[y][i]);
y=fa[y][i];
}
}
if(x==y)return ans;
for(int i=;i>=;i--)
{
if(fa[x][i]!=fa[y][i])
{
ans=min(ans,min(w[x][i],w[y][i]));
x=fa[x][i],y=fa[y][i];
}
}
ans=min(ans,min(w[x][],w[y][]));
return ans;
}
int main()
{
//freopen("1.in","r",stdin);
n=read();m=read();
for(int i=;i<=m;i++)
{
s[i].x=read();s[i].y=read();s[i].dis=read();
}
kruskal();
for(int i=;i<=n;i++)
{
if(vis[i]!=)
{
depth[i]=;
dfs(i);
fa[i][]=i;
w[i][]=inf;
}
}
for(int i=;i<=;i++)
for(int j=;j<=n;j++)
{
fa[j][i]=fa[fa[j][i-]][i-];
w[j][i]=min(w[j][i-],w[fa[j][i-]][i-]);
}
k=read();
for(int i=;i<=k;i++)
{
int x,y;
x=read();y=read();
cout<<lca(x,y)<<endl;
}
return ;
}

一天又过去,希望时间没白费。

萧瑟兰成看老去,为怕多情,不作怜花句。

最大生成树——LCA的更多相关文章

  1. bzoj3322 最大生成树+LCA

    题目大意:给个无向图,每条边有个限制,每个点最多能买入和卖出一定黄金:然后按顺序走过n个点,求每个卖出黄金的点最多能卖出多少黄金 一开始有点懵,想着怎么再图上做这个问题,后来知道要先建一棵最大生成树 ...

  2. ACM-ICPC 2018 徐州赛区网络预赛 J Maze Designer(最大生成树+LCA)

    https://nanti.jisuanke.com/t/31462 题意 一个N*M的矩形,每个格点到其邻近点的边有其权值,需要构建出一个迷宫,使得构建迷宫的边权之和最小,之后Q次查询,每次给出两点 ...

  3. ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer 最大生成树 lca

    大概就是要每两个点 只能有一条路径,并且约束,最短的边用来砌墙,那么反之的意思就是最大的边用来穿过 故最大生成树 生成以后 再用lca计算树上两点间的距离 (当然防止生成树是一条链,可以用树的重心作为 ...

  4. luogu 1967 货车运输(最大生成树+LCA)

    题意:给出一颗n个点的图,q个询问,每次询问u到v的路径中最小的边最大是多少. 图的最大生成树有一个性质,对于该图的任意两个点,在树中他们之间路径的最小边最大. 由于这个图不一定联通,于是我们对它的联 ...

  5. 【NOIP2013】货车运输 最大生成树+LCA

    题目描述 AA国有nn座城市,编号从 1到n,城市之间有m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重 ...

  6. [洛谷 P1967] 货车运输 (最大生成树 lca)

    题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...

  7. UVALive - 4960 Sensor network(生成树+LCA)

    题目大意:给出N个点.M条边.问这N个点形成的生成树的最大权值边-最小权值边的最小值 解题思路:先排序,然后按生成树的kruscal算法进行加边,再维护一个最小权值边 加边的时候要考虑一下加下去的边是 ...

  8. P1967 货车运输[生成树+LCA]

    题目描述 A国有n座城市,编号从 1到n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q* 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重 ...

  9. ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)

    ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...

随机推荐

  1. List中的Contains方法内部其实是用对象的equals方法做比较,所以如果比较两个类就重写类的equals方法即可;而Set是调用equals和hashCode

    public class Person { private String name; private int age; public String getName() { return name; } ...

  2. /usr/bin/ld: cannot find -lxxx 的解决办法

    /usr/bin/ld: cannot find -lxxx 的解决办法 在软件编译过程中,经常会碰到类似这样的编译错误: /usr/bin/ld: cannot find -lhdf5 这表示找不到 ...

  3. MFC之自绘控件

    在描绘MFC界面时,MFC自带的控件样式是绝对不满足界面的需求的. 所以我们就要在MFC自带控件基础上对控件样式进行重绘. 在采用自绘前界面样式 采用自绘后界面样式 是不是自绘控件后看起来正常了很多? ...

  4. Android5.x新特性之 Toolbar和Theme的使用

    Toolbar 你还在为Android 的ActionBar的文字不能随意设置位置而烦恼么?你还在为ActionBar不能自定义添加自己的布局而烦恼么?现在告诉你一个好消息,当你看到这篇文章时,就不必 ...

  5. 数字图像处理笔记与体会(一)——matlab编程基础

    最近开始学习数字图像处理,使用matlab实现,下面我就来记录笔记和体会,一方面是给大家提供参考,另一方面是防止我忘记了. 复习一下: 1.数字图像是用一个数字矩阵来表示的,数字阵列中的每个数字,表示 ...

  6. [Git] 解决 insufficient permission for adding an object to repository database

    [环境] OS: CentOS 6.5 Git: 1.7.1 [症状描述] Git 中心仓库路径 ~/project.git,克隆库路径 ~/project.clone,克隆库中包含一个文件 ~/pr ...

  7. Spring Web 应用的最大败笔

    开发人员在使用Spring应用是非常擅长谈论依赖注入的好处.不幸的是,他们不是那么真的利用它的好处,如单一职责原则,分离关注原则.如果我们一起来看看大部分Spring的Web应用程序,常见的错误的设计 ...

  8. Puppet nginx+passenger模式配置

    Puppet nginx+passenger模式配置 一.简述:Puppet 运行在单台服务器上默认启动的是一个puppetmaster进程,当遇到client高并发的请求时,基于ruby的WEBRi ...

  9. [转载]ASP.NET伪静态页面的实现和伪静态在IIS7.0中的配置

    ASP.NET伪静态 UrlRewrite(Url重写) 实现和配置 最近在写一个CMS的内容管理系统,需要用到一个伪静态方面的方法,在网上找了一下这方面的资料,现将这方面的资源记录一下. 本机环境: ...

  10. 【Python3】 django2.0 url 跳转设置

    python: 3.6.4 django :  2.0 在创建应用时候.我是把 urls.py 分开了.所以在设置url跳转时候.要修改成如下模式 1  父 urls.py 里边要加上命名空间 2   ...