今天说是要练习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. 【转载】浅谈TDD、BDD与ATDD软件开发

    转载自(此处仅供学习):http://blog.csdn.net/zhenyu5211314/article/details/22033295 1. 首先了解一下这三个开发模式都是什么意思: TDD: ...

  2. Kafka(三)-- Kafka主要参数

    原文地址:http://debugo.com/kafka-params/ ############################# System ########################## ...

  3. Handler基本用法

    片断一:mHandler = new Handler();mRunnable = new Runnable() { @Override public void run() { currentPosit ...

  4. 【LeetCode OJ】Longest Substring Without Repeating Characters

    题目链接:https://leetcode.com/problems/longest-substring-without-repeating-characters/ 题目:Given a string ...

  5. 【LeetCode OJ】Remove Element

    题目:Given an array and a value, remove all instances of that value in place and return the new length ...

  6. C常见机试题

    初级: 一.请编写函数long fun(long int x),功能是:将长整型数x中每一位上为奇数的数依次取出,并逆序和顺序分别构成一个新数返回.   例如:程序运行时输入123456789,输出: ...

  7. smarty 双引号中嵌入变量的方法

    1.如果变量中只包含字符.数字.下划线,可以将变量直接写在双引号中,如:"my name is $name" 2.如果带有其它字符,如“.”,则需要将变量用单引号括起来,如:“my ...

  8. 升级后重启造成fsck.ext3: Unable to resolve UUID

    这篇文章帮了我的大忙了:转载自:http://wilber82.blog.51cto.com/1124820/724472 今天在做服务器补丁部署,有一台ESX4.1的服务器在升级后重启过程中挂了,通 ...

  9. 数据导入报错:Got a packet bigger than‘max_allowed_packet’bytes的问题

    数据导入报错:Got a packet bigger than‘max_allowed_packet’bytes的问题 2个解决方法: 1.临时修改:mysql>set global max_a ...

  10. sonarqube插件开发(二) 开发插件

    一.环境准备 java 1.8, maven 3.1 检查自己的环境是否支持 sonarqube的插件开发 java -version mvn -version 二.创建maven项目 pom.xml ...