传送门

一道: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. 全文检索-Elasticsearch (一) 安装与基础概念

    ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口 Elasticsearch由java开发,所以在搭建时,需先安 ...

  2. linux centos6.5安装KVM

    1.安装kvm,vnc软件 http://www.server110.com/kvm/201404/10467.html yum install kvm,缺啥补啥 yum install kvm km ...

  3. NFS的安装

    NFS的安装鸟哥地址:http://vbird.dic.ksu.edu.tw/linux_server/0330nfs_2.php 13.2 NFS Server 端的设定 既然要使用 NFS 的话, ...

  4. 原型模式 prototype 创建型 设计模式(七)

    原型模式  prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象   显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...

  5. Java——重载和重写

    前言 在程序设计中经常会遇到对对方法的重载或者重写,下面将介绍重载和重写. 重载(Overloade) 重载出现的原因 任何程序设计语言都具备的一项重要特性就是对名字的运用.当创建一个对象时,就给对象 ...

  6. Perl多线程(2):数据共享和线程安全

    线程数据共享 在介绍Perl解释器线程的时候一直强调,Perl解释器线程在被创建出来的时候,将从父线程中拷贝数据到子线程中,使得数据是线程私有的,并且数据是线程隔离的.如果真的想要在线程间共享数据,需 ...

  7. 第28章 确认(Consent) - Identity Server 4 中文文档(v1.0.0)

    在授权请求期间,如果IdentityServer需要用户同意,则浏览器将被重定向到同意页面. 同意用于允许最终用户授予客户端对资源(身份或API)的访问权限.这通常仅对第三方客户端是必需的,并且可以在 ...

  8. JavaScript 文档对象模型(DOM)

    文档对象模型     通过 JavaScript,您可以重构整个 HTML 文档.您可以添加.移除.改变或重排页面上的项目.要改变页面的某个东西,JavaScript 就需要获得对 HTML 文档中所 ...

  9. SpringBoot 之Actuator.

    一.Actuator 介绍 Actuator 是 SpringBoot 项目中一个非常强大一个功能,有助于对应用程序进行监视和管理,通过 restful api 请求来监管.审计.收集应用的运行情况. ...

  10. 后端开发者的Vue学习之路(五)

    目录 上节内容回顾 使用第三方组件库 如何发起请求 请求错误处理 请求带参 以get的方式带参: 以post的方式带参: 封装处理 请求的配置 axios实例 实现调用自定义函数来发起请求 抽取axi ...