今天说是要练习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. SpringBoot(六)-- 静态资源处理

    1.Spring Boot 的默认资源映射 其中默认配置的 /** 映射到 /static (或/public./resources./META-INF/resources), 其中默认配置的 /we ...

  2. zabbix监控第一台服务器

    客户机的IP是192.168.0.80,主机名是wls12c 1. 安装客户端, 1.1 新建zabbix的用户 groupadd zabbix useradd -g zabbix zabbix 1. ...

  3. 获取预制和获取gameObject

    using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEditor; pu ...

  4. 深入浅出MongoDB应用实战开发

    写在前面的话: 这篇文章会有点长,谨此记录自己昨天一整天看完<深入浅出MongoDB应用实战开发>视频时的笔记.只是在开始,得先抛出一个困扰自己很长时间的问题:“带双引号的和不带双引号的j ...

  5. FTP文件下载

    using EnterpriseDT.Net.Ftp; /// <summary> /// 下载FTP文件 /// </summary> /// <param name= ...

  6. IOS网络篇1之截取本地URL请求(NSURLProtocol)

    本文转载至 http://blog.csdn.net/u014011807/article/details/39894247 NSURLProtocol 是iOS中非常重要的一个部分,我们经常会在以下 ...

  7. Objective-c官方文档 封装数据属性

    版权声明:原创作品,谢绝转载!否则将追究法律责任. 很多对象需要跟踪信息为了执行他们的任务.一些对象设计模型一个或者多个值.例如NSNumber 类用来保存一个值或者自定义的类有一些属性.有一些对象不 ...

  8. Linux 下Redis集群安装部署及使用详解(在线和离线两种安装+相关错误解决方案)

    一.应用场景介绍 本文主要是介绍Redis集群在Linux环境下的安装讲解,其中主要包括在联网的Linux环境和脱机的Linux环境下是如何安装的.因为大多数时候,公司的生产环境是在内网环境下,无外网 ...

  9. LeetCode 80 Remove Duplicates from Sorted Array II(移除数组中出现两次以上的元素)

    题目链接:https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/#/description 给定一个已经排好序的数组 ...

  10. php5.4 traits

    PHP 5.4中的traits,是新引入的特性,中文还真不知道如何准确翻译好.其实际的目的,是为了有的场合想用多继承,但PHP又没多继承,于是就发明了这样的一个东西.       Traits可以理解 ...