2016 UESTC Training for Data Structures H - 郭大侠与英雄学院 CDOJ 1338 并查集

本文介绍了一种针对矩阵的压缩算法,该算法保持了矩阵中各元素间的相对大小关系,并确保重复元素在同一行或列中拥有相同的值。通过使用并查集进行集合管理,实现了对矩阵的有效压缩。

H - 郭大侠与英雄学院

就是给你一个n*m的矩阵,然后叫你缩小这个矩阵,而且每行每列的数之间的大小关系不变,而且全为正数。

开始时想了好久也没想出来

先讨论没有重复点的情况,就是先把所有点按值升序排序,然后依次往新矩阵里放,放时的新的值为max(它所在行的最大值,它所在列的最大值)+1。然后这么放就行

但是有重复点,就比较麻烦了,而且只有同行同列的重复点才会产生影响,就是他们在新矩阵的值必须是一样的,如果不同行不同列,那么就没有影响

然后对于同行同列的相等的数,就必须用并查集把他们放到同一个集合里,

然后就是每行每列的扫过去就行,然后我是用set查的,遇到重复就并查集合并,那并查集用什么来编号呢,我是用的他们的位置,把二维转一维后按位置编号,这样编号就唯一啦,然后后面操作也方便

然后也是按值升序sort,然后从小到大往里面放数

还是考虑重复的情况,对于同一行同一列,相同数必须也要有对应的相同的新值,但是我们是按值的大小放的,所以所有相同的值会连续的放完,然后再放下一批相同的数,这样的话,我们就需要保存每行每列上的最大值,和这个最大值对应的之前的值的所在集合的根节点的那个编号,为什么要保存这个呢,首先要保存最大值是肯定的,然后因为考虑到相同的值是同一个集合嘛,所以要保存最大值所在集合的编号

然后后面更新的时候,如果发现当前值所在集合的编号和目前所在行/列的最大值的编号一样,就说明已经出现过了,不要再处理了,然后如果不一样的话,就是max(当前值所在集合的对应值,行最大值+1),然后再max(当前值所在集合的对应值,列最大值+1)。当然,我把所有数的初始对应值都设为0

然后因为我们所有同一集合里的数必须有相同的新值,所以我们更新时更新的是这个数的根节点的对应值,

这样操作完之后,就该输出啦,输出时我们也是输出这个点的根节点的新值就好啦

end


代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
#define ll long long
#define maxn 1000005
int n, m;
struct Node
{
	int num, idx;
	void make(int n, int i)
	{
		num=n,idx=i;
	}
	bool operator <(Node x)const
	{
		return num < x.num;
	}
	bool operator ==(Node x)const
	{
		return num == x.num;
	}
	bool operator <=(Node x)const
	{
		return num <= x.num;
	}
}grid[maxn], row[maxn], column[maxn];
int aim[maxn];
int parent[maxn];
int size[maxn];//结点数
void init_parent()
{
	for (int i = 0; i<maxn; ++i)
	{
		parent[i] = i;
		size[i] = 1;
	}
}
int findparent(int x)//路径压缩
{
	if (x == parent[x])
		return x;
	else
		return parent[x] = findparent(parent[x]);
}
void unionparent(int x, int y)//启发式合并
{
	int fx = findparent(x);
	int fy = findparent(y);
	if (fy == fx)
		return;
	if (size[fx] >= size[fy])
	{
		size[fx] += size[fy];
		parent[fy] = fx;
	}
	else
	{
		size[fy] += size[fx];
		parent[fx] = fy;
	}
}
int main()
{
	//freopen("input.txt", "r", stdin);
	scanf("%d%d", &n, &m);
	init_parent();
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < m; ++j)
		{
			scanf("%d", &grid[i*m + j].num);
			grid[i*m + j].idx = i*m + j;
		}
	set<Node> tmp;
	set<Node>::iterator itor;
	for (int i = 0; i < n; ++i)
	{
		tmp.clear();
		for (int j = 0; j < m; ++j)
		{
			itor = tmp.find(grid[i*m + j]);
			if (itor == tmp.end() || itor->num != grid[i*m + j].num)
				tmp.insert(grid[i*m + j]);
			else
				unionparent(itor->idx, grid[i*m + j].idx);
		}
	}
	for (int i = 0; i < m; ++i)
	{
		tmp.clear();
		for (int j = 0; j < n; ++j)
		{
			itor = tmp.find(grid[j*m + i]);
			if (itor == tmp.end() || itor->num != grid[j* m + i].num)
				tmp.insert(grid[j*m + i]);
			else
				unionparent(itor->idx, grid[j*m + i].idx);
		}
	}
	/*for (int i = 0; i < n*m; ++i)
		printf("%d ", findparent(i));
	printf("\n");*/
	sort(grid, grid + n*m);
	/*for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < m; ++j)
			printf("%d %d\n", grid[i*m + j].num, grid[i*m + j].idx);
	}
	printf("\n");*/
	for (int i = 0; i < n*m; ++i)
		row[i].idx = -1, column[i].idx = -1;
	for (int i = 0; i < n*m; ++i)
	{
		int idx = grid[i].idx;
		int pa = findparent(idx);
		if (row[idx/m].idx!=pa)
			aim[pa] = max(aim[pa], row[idx / m].num + 1);
		if (column[idx%m].idx != pa)
			aim[pa] = max(aim[pa], column[idx%m].num + 1);
		//row[idx / m] = max(row[idx / m], aim[pa]);
		row[idx / m].make(aim[pa], pa);
		column[idx%m].make(aim[pa], pa);
		//column[idx%m] = max(column[idx%m], aim[pa]);
		//printf("%d %d %d %d\n", pa, aim[pa], row[idx / m], column[idx%m]);
	}
	//printf("ans:\n");
	for (int i = 0; i < n; ++i)
	{
		//printf("%d", aim[findparent(i*n)]);
		for (int j = 0; j < m; ++j)
			printf("%d ", aim[findparent(i*m + j)]);
		printf("\n");
	}
	//system("pause");
	//while (1);
	return 0;
}


内容概要:本文围绕三相并网逆变器的控制策略展开研究,重点探讨了虚拟阻抗统一有源阻尼相结合的控制方法,并实现了SVPWM(空间矢量脉宽调制)SPWM(正弦脉宽调制)两种调制方式在Simulink平台下的仿真建模。通过引入虚拟阻抗改善系统输出阻抗特性,结合统一有源阻尼技术有效抑制LC或LCL滤波器引起的谐振问题,从而提升逆变器在弱电网条件下的并网稳定性电能质量。研究涵盖了控制策略的设计、调制算法的实现、动态响应分析及谐波抑制效果评估,同时拓展涉及正负序分离、中点电位平衡、DPWMA调制等关键技术,构建了完整的高性能并网逆变器控制系统仿真体系。; 适合人群:适用于从事电力电子、新能源发电、智能电网及相关领域的研究生、科研人员和工程技术人员,特别是具备三相并网逆变器控制理论基础并熟悉MATLAB/Simulink仿真环境的专业人士;; 使用场景及目标:①用于高校科研机构开展并网逆变器稳定性控制策略的深入研究;②支撑学位论文撰写、学术期刊投稿或科研项目申报中的仿真验证工作;③为企业研发高性能、高可靠性的并网逆变器产品提供先进的控制方案技术原型支持;; 阅读建议:建议读者结合提供的Simulink模型文件进行实际操作仿真验证,重点关注虚拟阻抗参数设计有源阻尼的协同作用机制,深入理解不同调制策略对系统性能的影响,并可进一步拓展学习文中提及的正负序控制、中点电位平衡等先进控制技术,全面提升对复杂电网环境下并网系统稳定运行机制的认知水平。
内容概要:本文围绕基于近端梯度算法求解LASSO分位数回归的短期风电功率预测方法展开研究,旨在提升预测模型在复杂环境下的精度鲁棒性。文章系统构建了LASSO分位数回归模型,深入剖析其数学原理,并引入近端梯度算法进行高效优化求解,有效应对高维稀疏数据异常值干扰等问题。通过Matlab平台完成了完整的算法实现仿真实验,利用实际风电数据验证了该方法在不同分位点下的预测性能,结果表明其相较于传统方法具有更强的稳定性和准确性。此外,文档还整合了电力系统、机器学习、路径规划等多个领域的相关科研方向技术应用案例,突出该方法在新能源预测智能优化中的广泛适用性实践价值。; 适合人群:具备扎实的数学基础(如凸优化、统计学习)Matlab编程能力,从事新能源发电预测、电力系统调度、智能优化算法或机器学习等领域的科研人员、工程技术人员及研究生。; 使用场景及目标:①应用于短期风电功率预测,增强模型对噪声、异常值及非平稳特性的适应能力,提升电网调度的安全性经济性;②为研究LASSO回归、分位数回归及近端梯度优化算法的学者提供可复现、可扩展的Matlab代码实例,便于算法改进对比实验;③作为可再生能源消纳、电力市场出清、微网能量管理等工程场景下的核心数据分析决策支持工具。; 阅读建议:此资源以算法实现为核心,建议读者在掌握LASSO分位数回归理论基础上,结合Matlab代码逐行分析近端梯度算法的迭代流程收敛特性,重点关注正则化项损失函数的权衡机制。同时可借鉴文中丰富的科研案例,拓展至光伏预测、负荷预测等相似应用场景,注重理论推导、代码实现实验验证的深度融合。
内容概要:本文围绕铰接式重型车辆的稳健路径跟踪控制问题,提出并实现了基于H∞控制器鲁棒线性二次调节器(RLQR)的控制策略。通过建立车辆动力学模型,针对系统中存在的外部干扰参数不确定性,设计H∞控制器以增强系统的抗干扰能力,并结合RLQR优化控制性能,在保证稳定性的同时提升路径跟踪精度。研究利用Matlab进行仿真验证,对比不同工况下的控制效果,展示了所提方法在复杂行驶环境下的优越性鲁棒性。; 适合人群:具备自动控制理论基础、车辆工程或自动化相关背景,熟悉Matlab/Simulink仿真工具,从事智能车辆控制、路径跟踪算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于铰接式重型车辆(如矿用卡车、大型拖挂车)的自动驾驶路径跟踪控制系统设计;②为解决存在模型不确定性和外界扰动条件下的鲁棒控制问题提供算法参考实现范例;③服务于高校科研项目、毕业论文或工业界智能运输系统的技术开发。; 阅读建议:此资源以Matlab代码为核心支撑,建议读者在学习过程中结合控制理论基础知识,运行并调试所提供的仿真程序,深入理解H∞RLQR控制器的设计流程参数整定方法,同时可通过修改模型参数或引入新的扰动场景进行拓展性实验,以增强实际应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值