首页 > 其他分享 >E. Cross Swapping-带权并查集cf1713

E. Cross Swapping-带权并查集cf1713

时间:2022-12-31 12:12:06浏览次数:62  
标签:const int ll 查集 Cross find fa 带权 cf1713

E. Cross Swapping

https://codeforces.ml/problemset/problem/1713/E

题意

给定n * n的矩阵 每次可以选定第k行和第k列交换位置 操作次数不限
求最小字典序的矩阵

思路

让i代表第i行不变 i + n代表第i行和第i列交换
如果a[i][j] < a[j][i] 那就不变, 将i和j并在一起,i + n和j + n并在一起,代表i j都不变或者都变
如果a[i][j] > a[j][i] 那就要变,将i和j + n并在一起,i + n和j并在一起, 代表i j一个变一个不变
然后我们根据行顺序,优先合并,如果两者已经合并就不用操作,因为前面的优先
最后找每个i的祖先 如果那个祖先代表变,即\(find(i) > n\)就代表它是要变集合中的

#include <bits/stdc++.h>
#include <stdlib.h>
using namespace std;
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define ll long long
#define int ll
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int N = 2e5 + 5;
const int M = 5e5 + 5;
const ll mod = 1e9 + 7;

int n;
int fa[2005];

int find(int x){
	return x == fa[x] ? x : fa[x] = find(fa[x]);
}

void solve()
{
	cin >> n;
	for(int i = 1; i <= n * 2; i++)
		fa[i] = i;
	
	vector<vector<int>>a((n + 1), vector<int>(n + 1));
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= n; j++)
			cin >> a[i][j];

	for(int i = 1; i <= n; i++){
		for(int j = i + 1; j <= n; j++){
			if(a[i][j] == a[j][i])
				continue;
			
			if(find(i) == find(j) || find(i + n) == find(j)) 
				continue;
			
			int u = find(i), v = find(j);
			int uu = find(i + n), vv = find(j + n);
			if(a[i][j] < a[j][i]){
				fa[u] = v;
				fa[uu] = vv;
			}
			else {
				fa[u] = vv;
				fa[uu] = v;
			}
		}
	}

	for(int i = 1; i <= n; i++){
		if(find(i) > n) continue;
		for(int j = 1; j <= n; j++)
			swap(a[i][j], a[j][i]);
	}

	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			cout << a[i][j] << " \n"[j == n];
		}
	}
}


signed main()
{
	IOS;
	int t = 1;
	cin >> t;
	while (t--)
	{
		solve();
	}
}

标签:const,int,ll,查集,Cross,find,fa,带权,cf1713
From: https://www.cnblogs.com/yaqu-qxyq/p/17015729.html

相关文章

  • TZOJ 5782: 亲戚/6310: 亲戚2 并查集/路径压缩/优化
    先来看看代码清单:(1)初始化for(inti=1;i<=n;i++)f[i]=i;//初始化每个的爹是自己因为每个元素属于单独的一个集合,所以每个元素以自己作为结点(2)寻找根结点编号并压......
  • P1024 [NOI2001] 食物链【种类并查集】
    题意P1024简化题意:给定\(n\)和\(k(n\leqslant5\times10^4,k\leqslant10^5)\),表示有\(n\)个动物,\(k\)个描述,其中:\(n\)个动物分别属于\(A,B,C\)中的一种,定义......
  • 数据结构:并查集 学习笔记
    数据结构:并查集学习笔记基础知识并查集是一种树形数据结构。在全国青少年信息学奥林匹克系列竞赛大纲中难度为6,是提高级中学习的数据结构。并查集的基本操作:查询一......
  • 并查集
    title:并查集date:2022-11-1511:49:57tags:算法本文章遵守知识共享协议CC-BY-NC-SA,转载时须在文章的任一位置附上原文链接和作者署名(rickyxrc)。推荐在我的个人博......
  • 带权树的过滤
    带权树形结构的过滤1.带权树1.1.树的概念树是一种数据结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树也就是......
  • 带权并查集
    被老师拖来讲数据结构了带权并查集带权并查集,顾名思义,就是在并查集中加上权值,点权和边权实际上是等价的,因为并查集实际上是多棵树组成的,树上的每个节点,都只有一个父节点,......
  • 一个并查集对象
    实现并查集的查找、合并、类别sizeclassUF{constructor(n){this.parent=Array(n)this.size=[]for(leti=0;i<n;i++){......
  • hdu:继续畅通工程(kruskal的MST并查集实现)
    ProblemDescription省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表......
  • hdu:小希的迷宫(并查集)
    ProblemDescription上次Gardon的迷宫城堡小希玩了很久,现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说......
  • 图论-堆-并查集-2503. 矩阵查询可获得的最大分数
    2503.矩阵查询可获得的最大分数DescriptionDifficulty:困难RelatedTopics:给你一个大小为mxn的整数矩阵grid和一个大小为k的数组queries。找出一个大小......