首页 > 其他分享 >cats 的最小生成树

cats 的最小生成树

时间:2024-08-26 20:03:53浏览次数:9  
标签:get int 查集 最小 long 生成 fa cats ans

  • 开300000个并查集固然会空间超限,但考虑到每个并查集内部都存在着大量的空间浪费,因此你完全可以实现“动态开点”并查集
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int fa[700005],s[700005],u[300005],v[300005],ans[300005];
unordered_map<long long,int>V;
int get(int x)
{
	if(fa[x]==x)
	{
		return x;
	}
	return fa[x]=get(fa[x]);
}
void merge(int u,int v)
{
	s[get(v)]+=s[get(u)];
	fa[get(u)]=get(v);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		long long n,m;
		cin>>n>>m;
		for(int i=1;i<=m;i++)
		{
			cin>>u[i]>>v[i];
		}
		int tot=n;
		for(int i=1;i<=n+2*m;i++)
		{
			fa[i]=i;
			s[i]=1;
		}
		V.clear();
		for(int p=1;p<=m;p++)
		{
			if(get(u[p])!=get(v[p]))
			{
				merge(u[p],v[p]);
				ans[p]=1;
				continue;
			}
			int cur=0;
			for(int i=18;i>=0;i--)
			{
				long long x=u[p]+(cur+(1<<i))*n;
				long long y=v[p]+(cur+(1<<i))*n;
				if(V.find(x)==V.end())
				{
					continue;
				}
				if(V.find(y)==V.end())
				{
					continue;
				}
				if(get(V[x])==get(V[y]))
				{
					cur+=(1<<i);
				}
			}
			cur++;
			long long x=u[p]+cur*n;
			long long y=v[p]+cur*n;
			if(V.find(x)==V.end())
			{
				tot++;
				V[x]=tot;
			}
			if(V.find(y)==V.end())
			{
				tot++;
				V[y]=tot;
			}
			merge(V[x],V[y]);
			ans[p]=cur+1;
		}
		for(int i=1;i<=m;i++)
		{
			if(ans[i]==1&&s[get(1)]!=n||ans[i]>1&&s[get(V[1+(ans[i]-1)*n])]!=n)
			{
				ans[i]=-1;
			}
			if(i!=1)
			{
				cout<<" ";
			}
			cout<<ans[i];
		}
		cout<<endl;
	}
	return 0;
}

标签:get,int,查集,最小,long,生成,fa,cats,ans
From: https://www.cnblogs.com/watersail/p/18381534

相关文章

  • cats 的数据结构
    相信OI美学点击查看代码#include<bits/stdc++.h>usingnamespacestd;vector<int>a[200005];intf[200005],s[200005],ansa[200005],ansb[200005];voiddp(intn1){s[n1]=1;f[n1]=n1;for(inti=0;i<a[n1].size();i++){dp(a[n1][......
  • Python——生成器、递归、内省、高阶和偏函数
    Python的生成器(Generators)是一种特殊的迭代器,它使用类似于函数的语法定义,但是使用yield语句一次返回一个值(可以多次返回),而不是使用return语句。生成器函数允许你声明一个像迭代器那样的对象,但是你可以使用更简洁的语法来创建它们。为什么要使用生成器?内存效率高:生成器按需产......
  • 生成函数
    生成函数普通生成函数(ordinarygeneratingfunction,OGF)定义序列\(a\)的普通生成函数为:\[F(x)=\sum_na_nx^n\]\(a\)既可以是有穷序列,也可以是无穷序列。例子:1、序列\(a=\langle1,2,3\rangle\)的OGF为\(1+2x+3x^2\);2、序列\(a=\langle1,1,1,\cdots\rang......
  • 【生日视频制作】广州塔表白字幕生日视频制作AE模板修改文字软件生成器教程特效素材【
    广州塔表白字幕生日视频制作教程AE模板改文字生成神器素材祝福怎么如何做的【生日视频制作】广州塔表白字幕生日视频制作AE模板修改文字软件生成器教程特效素材【AE模板】生日视频制作步骤:安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频......
  • 【生日视频制作】一群美女挥手拉蓝横幅条幅AE模板修改文字软件生成器教程特效素材【AE
    一群美女挥手拉蓝条横幅生日视频制作教程AE模板修改文字生成器怎么如何做的【生日视频制作】一群美女挥手拉蓝横幅条幅AE模板修改文字软件生成器教程特效素材【AE模板】生日视频制作步骤:安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频......
  • 【生日视频制作】航拍哈尔滨超大堆雪人AE模板修改文字软件生成器教程特效素材【AE模板
    哈尔滨超大堆雪人生日视频制作教程AE模板修改文字软件生神器素怎么如何做的【生日视频制作】航拍哈尔滨超大堆雪人AE模板修改文字软件生成器教程特效素材【AE模板】生日视频制作步骤:安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频......
  • 第八期 RAG检索增强生成
    一:RAGvsFine-tuning(一)Fine-tuning(微调)是用一定量的数据集对LLM进行局部参数的调整,以期望LLM更加理解我们的业务逻辑,有更好的zero-shot能力。(二)RAG(检索增强生成)是把企业内部的文档数据先进行embedding,借助检索先获得大致的知识范围答案,再结合prompt给到LLM,让LLM生成最终的答......
  • Centos7(最小化安装)系统源代码安装mysql5.7.44版本
    官网下载mysql源代码安装包步骤(旧档案-版本下载方式)-CSDN博客下载cmake操作步骤-CSDN博客下载ncurses操作步骤-CSDN博客下载bison操作步骤-CSDN博客下载boost操作步骤-CSDN博客安装之前由于是最小化安装centos7安装一些开发环境和工具包文章使用国内阿里源cd/etc/yum.r......
  • 自动生成依赖清单:pipreqs,Python项目的救星
    文章目录**自动生成依赖清单:pipreqs,Python项目的救星**背景:为何选择pipreqs?pipreqs是什么?如何安装pipreqs?库函数使用方法场景应用场景一:新项目初始化场景二:更新现有项目依赖场景三:排除特定库常见Bug及解决方案Bug1:找不到项目中的某些依赖Bug2:生成的依赖文件中包含错误......
  • FastAdmin前端开发——词条生成二维码
    一、前端开发基础文件序号文件路径功能1application/index/controller控制器文件2application/index/lang/zh-cn语言包3application/index/model模型文件4application/index/view/common/sidenav.html左侧菜单栏5application/index/view/index.html右侧列表视图6application/i......