传送门

一道:LCA+最大生成树

个人认为把这两个的板子写好(并熟练掌握了之后)就没什么难的

(但我还是de了好久bug)qwq

最大生成树:其实就是最小生成树的变形

我用的是kruskal

(个人觉得kruskal比较好像and好写)

所以

对于kruskal而言

只是把边从小到大排序改成从大到小序就可以了

需要多维护一个w[ i ][ j ]数组

用来存从i点向上走j^2次步这个过程中最大承重量

又是数组开小了

(明明我算的不用那么大的啊qwq)

向现实低头

#include<cstdio>
#include<algorithm>
#define INF 999999999
using namespace std;
inline int read()//快读
{
int sum = ,p = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-')
p = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
(sum *= )+= ch - '';
ch = getchar();
}
return sum * p;
} const int maxn = ,maxm = ;
int n,m,cnt;
int head[maxn],deep[maxn],f[maxn][],fa[maxn],w[maxn][];
bool vis[maxn]; struct edge1
{
int from,to,wei;
}e1[maxm]; struct edge2
{
int next,to,wei;
}e2[maxm*]; bool cmp(edge1 a,edge1 b)
{
return a.wei > b.wei;
} int find(int o)
{
if(o == fa[o])
return o;
else
return fa[o] = find(fa[o]);
} void add(int x,int y,int z)
{
e2[++cnt].next = head[x];
e2[cnt].to = y;
e2[cnt].wei = z;
head[x] = cnt;
} void kruskal()
{
sort(e1+,e1+m+,cmp);
for(int i = ;i <= n;i++)
fa[i] = i;//并查集初始化:每个节点各为一个子树,即每个点的父节点都是他自己
int v,u;
for(int i = ;i <= m;i++)
{
u = find(e1[i].from);
v = find(e1[i].to);
if(u == v)//如果两个点已经在一个图中了,即这两个点已经有一个最大的边加入到生成树中了,那么再加进去就会生成环,所以不能加
continue;
fa[u] = v;//把v加入到生成树中
add(e1[i].from,e1[i].to,e1[i].wei);
add(e1[i].to,e1[i].from,e1[i].wei);//无向图,双向加边
}
return;
} void dfs(int o)
{
vis[o] = true;
for(int i = head[o];i;i = e2[i].next)
{
int to = e2[i].to;
if(vis[to])
continue;
deep[to] = deep[o] + ;
f[to][] = o;
w[to][] = e2[i].wei;
dfs(to);
}
} int lca(int x,int y)
{
if(find(x) != find (y))
return -;
int ans = INF;
if(deep[x] > deep[y])
swap(x,y);
for(int i = ;i >= ;i--)
if(deep[f[y][i]] >= deep[x])
{
ans = min(ans,w[y][i]);
y = f[y][i];
}
if(x == y)
return ans;
for(int i = ;i>=;i--)
if(f[x][i] != f[y][i])
{
ans = min(ans,min(w[x][i],w[y][i]));
x = f[x][i];
y = f[y][i]; }
ans = min(ans,min(w[x][], w[y][]));
return ans;
} int main()
{
n = read(),m = read();
int x,y,z;
for(int i = ;i <= m;i++)
{
x = read(),y = read(),z = read();
e1[i].from = x;
e1[i].to = y;
e1[i].wei = z;
}
kruskal();
for(int i = ;i <= n;i++)
if(!vis[i])
{
deep[i] = ;
dfs(i);
f[i][] = i;
w[i][] = INF;
}
for(int i = ;i <= ;i++)
for(int j = ;j <= n;j++)
{
f[j][i]=f[f[j][i-]][i-];
w[j][i]=min(w[j][i-], w[f[j][i-]][i-]);
}
int q = read();
for(int i = ;i <= q;i++)
{
x = read(),y = read();
printf("%d\n",lca(x,y));
}
return ;
}

货车运输-洛谷-1967-LCA+最大生成树(kruskal(并查集))的更多相关文章

  1. Codevs 3287 货车运输 == 洛谷P1967

    3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 n 座城市,编 ...

  2. 洛谷P4004 Hello world!(分块+并查集)

    传送门 虽然洛谷数据水,然而咱最终还是没有卡过uoj上的毒瘤数据-- 神tm全uoj就3个人过了这题-- 首先,每个数最多被开根\(6\)次,开到\(1\)之后就别管它了,把它用并查集连到它父亲上 它 ...

  3. 洛谷P3247 [HNOI2016]最小公倍数 [分块,并查集]

    洛谷 思路 显然,为了达到这个最小公倍数,只能走\(a,b\)不是很大的边. 即,当前询问的是\(A,B\),那么我们只能走\(a\leq A,b\leq B\)的边. 然而,为了达到这最小公倍数,又 ...

  4. Bzoj5188/洛谷P4185 [Usaco2018 Jan]MooTube(并查集)

    题面 Bzoj 洛谷 题解 最暴力的方法是直接判两个点之间的路径最小值是否\(\geq k\),用\(Dijkstra\)可以做到该算法最快效率,但是空间复杂度始终是\(O(n^2)\)的,会\(ML ...

  5. 洛谷P1196 银河英雄传说[带权并查集]

    题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...

  6. [洛谷P1197/BZOJ1015][JSOI2008]星球大战Starwar - 并查集,离线,联通块

    Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...

  7. 【洛谷P3224】永无乡 并查集+Splay启发式合并

    题目大意:给定 N 个点的图,点有点权,初始有一些无向边,现在有 Q 个询问,每个询问支持动态增加一条无向边连接两个不连通的点和查询第 X 个点所在的联通块中权值第 K 大的是哪个点. 题解:学会了平 ...

  8. 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]

    题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时 ...

  9. 【洛谷】P1196 银河英雄传说(并查集)

    题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...

随机推荐

  1. Jvm垃圾回收器(基础篇)

    一:概述 在这篇文章中<Jvm运行时数据区>介绍了Java内存运行时区域的各个部分,其中程序计数器.虚拟机栈.本地方法栈,3个区域随着线程的生存而生存的.内存分配和回收都是确定的.随着线程 ...

  2. 用Scrutor来简化ASP.NET Core的DI注册

    目录 背景 Scrutor简介 Scrutor的简单使用 注册接口的实现类 注册类自身 重复注册处理策略 总结 相关文章 背景 在我们编写ASP.NET Core代码的时候,总是离不开依赖注入这东西. ...

  3. VisualStudio移动开发(C#、VB.NET)Smobiler开发平台——GifView控件的使用方式

    一.          样式一 我们要实现上图中的效果,需要如下的操作: 从工具栏上的“Smobiler Components”拖动一个GifView控件到窗体界面上 修改GifView的属性 Aut ...

  4. List<T>常用操作函数

    1.Add():添加单个元素2.AddRange():添加一个集合4.Insert():插入一个元素5.InsertRange():插入一个集合6.Remove():移除指定的元素7.RemoveAt ...

  5. 分享PowerDesigner使用的设置

    用PowerDesigner比较直观, 方便管理,修改数据库,分享 Oracle的逆向工程,和模型图的显示设置 https://blog.csdn.net/u011781521/article/det ...

  6. 【小o地图Excel插件版】计算两点间驾车路径,获取途径道路、驾车距离、耗时等信息

    小o地图Excel插件版:一款基于Excel软件开发的地图软件,提供基于Excel表格进行地理数据挖掘.地理数据分析.地图绘制.地图图表等功能的工具类软件.具有易用.高效.稳定的特点,能够满足地理数据 ...

  7. Java开发笔记(五十八)简单接口及其实现

    前面介绍了抽象方法及抽象类的用法,看似解决了不确定行为的方法定义,既然叫唤动作允许声明为抽象方法,那么飞翔.游泳也能声明为抽象方法,并且鸡类涵盖的物种不够多,最好把这些行为动作扩展到鸟类这个群体,于是 ...

  8. Django验证码【附源码】

    一.安装依赖 CentOS 第一步: yum install python-devel 第二步: yum install freetype-devel libjpeg-devel libpng-dev ...

  9. 使用 empApi 组件实现 Change Data Capture 功能

    Change Data Capture 功能是从 Winter '19 版本开始正式启用的功能. 它是基于"发布-订阅"模式设计,可以将 Salesforce 中记录的改变自动推送 ...

  10. 39.Odoo产品分析 (四) – 工具板块(8) – 生产力(1)

    查看Odoo产品分析系列--目录 生产力相当于一个即时贴或便签.用便签或待办事项处理个人的任务.  安装生产力模块,得到"便签"主菜单:  创建一个便签,该表单对应note.not ...