首页 > 其他分享 >货车运输(LCA+最大生成树)

货车运输(LCA+最大生成树)

时间:2024-03-17 09:01:42浏览次数:24  
标签:cnt int LCA 货车运输 生成 fa edge ans dis

货车运输
这题会有重边,又因为求的是尽可能大的边中的最小值,所以我们可以先用最大生成树维护,如何用最大生成树呢?可以用Kruskal和并查集,顺便处理重边,处理完重边后,可以用倍增LCA求两点之间的最大载重量
处理重边时,必须把dis在x,y相同情况下大的排在前,以保证最优,用并查集find判断是否是重边
建完以后,有环图便成了一棵树

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N = 50010;
int n,m,q;
int a[N/5],cnt,head[N/5];
int d[N/5],f[N/5][23],fa[N/5];bool vis[N/5];
struct EDGE
{
	int from,to,next,w;
}edge[N*2];
struct ED
{
	int x,y,dis;
}e1[N];
bool cmp(ED a,ED b)
{
	return a.dis>b.dis;
}
void add(int u,int v,int w)
{
	edge[++cnt].from=u;
	edge[cnt].to=v;
	edge[cnt].next=head[u];
	edge[cnt].w=w;
	head[u]=cnt;
}
int find(int x)
{
	if(fa[x]!=x)
	{
		fa[x]=find(fa[x]);
	}
	return fa[x];
}
void kruskal()
{
	sort(e1+1,e1+1+m,cmp);
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=m;i++)
	{
		int x=find(e1[i].x),y=find(e1[i].y);
		if(x==y)continue;
		fa[y]=x;
		add(e1[i].x,e1[i].y,e1[i].dis);add(e1[i].y,e1[i].x,e1[i].dis);
	}
	return;
}
int dis[N/5][23];
void dfs(int x)
{
	vis[x]=1;
	for(int i=head[x];i;i=edge[i].next)
	{
		int to=edge[i].to;
		if(vis[to])continue;
		dis[to][0]=edge[i].w;
		d[to]=d[x]+1;
		f[to][0]=x;
		dfs(to);
		
	}
}
void dfs_init()
{
	for(int j=1;j<23;j++)
	{
		for(int i=1;i<=n;i++)
		{
			f[i][j]=f[f[i][j-1]][j-1];
			dis[i][j]=min(dis[i][j-1],dis[f[i][j-1]][j-1]);
		}
	}
}
int lca(int x,int y)
{
	int ans=INT_MAX;
	if(d[x]<d[y])swap(x,y);
//	int D=d[x]-d[y];
	for(int i=22;i>=0;i--)
	{
		if(d[f[x][i]]>=d[y])//i&
		{
			ans=min(ans,dis[x][i]),x=f[x][i];
//			cout<<x<<endl;
		}
	}
	if(x==y)return ans;
	for(int i=22;i>=0;i--)
	{
		if(f[x][i]!=f[y][i])
		{
			ans=min({ans,dis[x][i],dis[y][i]});
			x=f[x][i];
			y=f[y][i];
		}
	}
	ans=min({ans,dis[x][0],dis[y][0]});//不要忘记自身比较,否则会少情况
	return ans;
}
int main()
{
	scanf("%d%d",&n,&m);
	int x,y,z;
//	memset(dis,0x3f,sizeof(dis));
//	for(int i=1;i<=n;i++)
//		for(int j=0;j<23;j++)dis[i][j]=INT_MAX;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&e1[i].x,&e1[i].y,&e1[i].dis);
	}
	kruskal();
	scanf("%d",&q);
	for(int i=1;i<=n;i++)
	if(!vis[i])
	{	
		f[i][0]=i;
		d[i]=1;
		dfs(i);
		dis[i][0]=INT_MAX;
	}
	dfs_init();
//	for(int i=1;i<=n;i++)cout<<dis[i][0]<<" ";
//	cout<<endl;
	for(int i=1;i<=q;i++)
	{
		scanf("%d%d",&x,&y);
		int rx=find(x);int ry=find(y);
		if(rx!=ry)
		{
			printf("-1\n");
		}else
		{
//			cout<<x<<" "<<y<<endl;
			printf("%d\n",lca(x,y));
		}
	}
	return 0;
}
/*
4 4
1 2 4
2 3 3
3 1 1
1 2 5
3
1 3
1 4
1 3
*/

标签:cnt,int,LCA,货车运输,生成,fa,edge,ans,dis
From: https://www.cnblogs.com/wlesq/p/18078069

相关文章

  • Activiti7 ID生成器
    Activiti有自己的主键生成策略总结一下主键生成策略1、act_ge_property表中next.dbid保存id的初始值(代码中用oldValue表示)2、每次获取2500个id,相当于预占了2500个id,即每次获取oldValue~oldValue+2500这个范围的id3、nextId表示下一个id,lastId表示这一批次的......
  • 大都市meg(线段树/树状数组+LCA)
    题目描述在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员BlueMary也开始骑着摩托车传递邮件了。不过,她经常回忆起以前在乡间漫步的情景。昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之间有一些双向的土路。从每个村庄都恰好有一条路径到达村庄1(即比特堡)。并且......
  • 命令行生成jar文件
    做IT也二十年有余了,一直做着运维工作,编程仅是业余兴趣,水平就是在HelloWorld的基础上多做几个练习,行在各语言都能试试手,偶尔也能做些提高效率小工具,多是味都没怎么嚼就新版本了,人也白发生了...运维吗,效率在先,什么容易就用什么,c#,php,autoit,shell,bat,vba,sql,powershell,python,唯java总......
  • 深度解析Sora视频生成原理
    在当今数字时代,视频内容已经成为人们生活中不可或缺的一部分。Sora视频生成技术的出现,为视频内容的创作和生产带来了全新的可能性。Sora是一种基于人工智能的视频生成技术,它能够以惊人的速度和精度生成高质量的视频内容,为视频制作人员提供了强大的工具。本文将深度解析Sora视频生......
  • perl 用 XML::LibXML DOM 解析 Freeplane.mm文件,生成测试用例.csv文件
    Freeplane是一款基于Java的开源软件,继承Freemind的思维导图工具软件,它扩展了知识管理功能,在Freemind上增加了一些额外的功能,比如数学公式、节点属性面板等。在云计算中,解析XML元素和属性是一种常见的操作,因为XML是一种常见的数据交换格式,可以用来表示各种不同的数据结......
  • P4211 [LNOI2014] LCA 题解
    link切入这道题,首先要思考所有LCA的分布特征。显然,对于任意\(\text{LCA}(i,j)\),都满足LCA是\(i,j\)的祖先。那么对于一个询问,可以找到所有\(i\in[l,r]\)的祖先,还可以找所有\(z\)的祖先。明显,找\(z\)的祖先会方便很多:它们都分布在\(z\)到根节点的那条链上,这应......
  • MybatisPlus[新]逆向工程,代码生成器
    MybatisPlus旧版本的代码生成器官方新版已经不在维护了.并在新版中,将内部的构造方法改成了private,导致新版本的myabtis-plus无法使用旧版本的代码生成器.下列配置是新版本的代码生成配置添加依赖<!--代码自动生成器依赖--><dependency><groupId>com.baomidou</......
  • mybatis-plus代码生成
    添加依赖:<!--代码自动生成器依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.3.1</version></dependency><dependency><gro......
  • 微信小程序开发:异步处理接入的生成式图像卡通化
    书接上文,我们完成了对接阿里云人像动漫化接口,现已完成的界面是这样的: 就是效果看着一般,看看效果: 然后我就在阿里云api市场转悠,就想看看还有没有什么其他奇奇怪怪的api,结果就发现了这个:api链接这里:https://help.aliyun.com/zh/viapi/api-generative-image-cartoon ......
  • 图论——倍增LCA 学习笔记
    图论——倍增LCA学习笔记定义最近公共祖先,简称LCA(LowestCommonAncestor)。一个集合\(S\)的最近公共祖先\(\text{LCA}(S)=\text{LCA}(s_1,s_2,\dots,s_k)\)定义为:这个集合中所有节点,其祖先的交集中,离根最远的那个。性质在数值的关系上:\(\text{LCA}(\{u\})=u\);\(\t......