种类并查集:定义种类之间的关系来判断操作是否进行

题目大意:对于题目给出的一个矩阵,我们可以进行一种操作:swap(a[i][j],a[j][i])

使得矩阵可以变换为字典序最小的矩阵

思路:

  通过扫描整个矩阵,每次都判断a[i][j] 和 a[j][i]是否需要交换

  交换的前提就是: 对第i行/第j列操作,如果既对第 i 行又第 j 列进行操作等于没交换

  所以我们可以将 i 和 j定义为敌人,当 他们是敌人的时候,说明需要交换

  而他们是朋友的时候就说明无需交换

  这里就涉及到种类并查集了,我们定义一个2*n的数组,如果i 和 j 是敌人:

    merge( i , j+n );

    merge( i+n , j );

  这样在查询时如果find(i)>n说明i与另外一个元素有敌对关系,可以进行交换

  否则如果是朋友:

    merge( i , j );

    merge( i+n , j+n );

  find(i) <= n 说明他们为朋友关系,不可以交换

 1 # include<iostream>
2 # include<bits/stdc++.h>
3 using namespace std;
4 # define int long long
5 # define endl "\n"
6 const int N = 2e5 + 10;
7 int a[1010][1010];
8 int f[1010 << 1];
9 vector<int> siz(1010 << 1);
10 int find(int x) {
11 if (f[x] == x) return x;
12 else return find(f[x]);
13 }
14
15 void merge(int a, int b) {
16 int x = find(a);
17 int y = find(b);
18 if (x != y) {
19 if(siz[x]>siz[y]) swap(x,y);
20 f[x] = y;
21 siz[y] += siz[x];
22 }
23 }
24 void solve() {
25 int n;
26 cin >> n;
27 for (int i = 1; i <= n; ++i)
28 for (int j = 1; j <= n; ++j)
29 cin >> a[i][j];
30 for (int i = 1; i <= 2 * n; ++i) {
31 f[i] = i;
32 siz[i] = 1;
33 }
34 for (int i = 1; i <= n; ++i)
35 for (int j = i + 1; j <= n; ++j) {
36 if (a[i][j] > a[j][i]) {
37 int x = find(i), y = find(j);
38 if (x == y) continue;
39 merge(i, j + n);
40 merge(i + n, j);
41 } else if (a[i][j] < a[j][i]) {
42 int x = find(i), y = find(j + n);
43 if (x == y) continue;
44 merge(i, j);
45 merge(i + n, j + n);
46 }
47 }
48 for (int j = 1; j <= n; ++j) {
49 if (find(j) > n) continue;
50 for (int i = 1; i <= n; ++i) swap(a[i][j], a[j][i]);
51 }
52 for (int i = 1; i <= n; ++i) {
53 for (int j = 1; j <= n; ++j) {
54 cout << a[i][j] << " ";
55 }
56 cout << endl;
57 }
58
59 }
60 int tt;
61 signed main() {
62 ios::sync_with_stdio(false);
63 cin.tie(0);
64 cout.tie(0);
65 cin >> tt;
66 while (tt--)solve();
67
68
69 return 0;
70 }

需要注意的是,因为要求字典序最小,所以要求优先满足之前的关系,所以在每次维护关系的时候

需要先对之前的关系进行判断。

Codeforces Round #812 (Div. 2) E(并查集)的更多相关文章

  1. Codeforces Round #376 (Div. 2) C. Socks---并查集+贪心

    题目链接:http://codeforces.com/problemset/problem/731/C 题意:有n只袜子,每只都有一个颜色,现在他的妈妈要去出差m天,然后让他每天穿第 L 和第 R 只 ...

  2. Codeforces Round #541 (Div. 2) D 并查集 + 拓扑排序

    https://codeforces.com/contest/1131/problem/D 题意 给你一个n*m二维偏序表,代表x[i]和y[j]的大小关系,根据表构造大小分别为n,m的x[],y[] ...

  3. Codeforces Round #286 (Div. 2) B 并查集

    B. Mr. Kitayuta's Colorful Graph time limit per test 1 second memory limit per test 256 megabytes in ...

  4. Codeforces Round #812 (Div. 2) D. Tournament Countdown(交互题)

    记录一下第一次写交互题 题目大意:一共有1<<n个人参加一场竞标赛,需要你通过比较两人的胜场来判断谁晋级,最终获得第一名 最多1/3*2^(n+1)次询问,每次询问query(a,b),如 ...

  5. Codeforces Round #374 (div.2)遗憾题合集

    C.Journey 读错题目了...不是无向图,结果建错图了(喵第4样例是变成无向就会有环的那种图) 并且这题因为要求路径点尽可能多 其实可以规约为限定路径长的拓扑排序,不一定要用最短路做 #prag ...

  6. DFS/并查集 Codeforces Round #286 (Div. 2) B - Mr. Kitayuta's Colorful Graph

    题目传送门 /* 题意:两点之间有不同颜色的线连通,问两点间单一颜色连通的路径有几条 DFS:暴力每个颜色,以u走到v为结束标志,累加条数 注意:无向图 */ #include <cstdio& ...

  7. Codeforces Round #582 (Div. 3)-G. Path Queries-并查集

    Codeforces Round #582 (Div. 3)-G. Path Queries-并查集 [Problem Description] 给你一棵树,求有多少条简单路径\((u,v)\),满足 ...

  8. Codeforces Round #346 (Div. 2)---E. New Reform--- 并查集(或连通图)

    Codeforces Round #346 (Div. 2)---E. New Reform E. New Reform time limit per test 1 second memory lim ...

  9. Codeforces Round #383 (Div. 2) 题解【ABCDE】

    Codeforces Round #383 (Div. 2) A. Arpa's hard exam and Mehrdad's naive cheat 题意 求1378^n mod 10 题解 直接 ...

随机推荐

  1. identity4 系列————纯js客户端案例篇[四]

    前言 前面已经解释了两个案例了,通信原理其实已经很清楚了,那么纯js客户端是怎么处理的呢? 正文 直接贴例子哈. https://github.com/IdentityServer/IdentityS ...

  2. 【java】学习路径18-Arrays中的sort、binarySearch使用注意

    在使用Arrays.binarySearch()的时候要注意先对数组进行排序. Arrays.binarySearch()方法介绍: Searches the specified array of i ...

  3. 快速搭建 SpringCloud Alibaba Nacos 配置中心!

    Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务开发解决方案,目前已被 Spring Cloud 官方收录.而 Nacos 作为 Spring Cloud Alibaba 的核心 ...

  4. dotnet 设计规范 · 抽象类

    X 不要定义 public 或 protected internal 访问的构造函数.默认 C# 语言不提供抽象类的公开构造函数方法. 如果一个构造函数定义为公开,只有在开发者需要创建这个类的实例的时 ...

  5. clipboard实现文本复制的方法

    1.下载地址: https://github.com/mo3408/clipboard 2.使用方法: 先引入js: <script src="dist/clipboard.min.j ...

  6. KingbaseES V8R6C5单实例sys_backup.sh备份案例

    ​ 案例说明: KingbaseES V8R6C5版本中使用了securecmdd工具,用于主机节点间的通讯,默认端口8890.备份工具sys_backup.sh默认使用了securecmdd工具,对 ...

  7. 【疑难杂症】关于用pydotplus生成iris.pdf报错问题

    在使用刘建平老师博客中DecisionTreeClassifier实例时,遇到报错:InvocationException: GraphViz's executables not found 源代码如 ...

  8. Docker 数据共享与持久化

  9. Elasticsearch不支持事务有什么好的弥补方案

    1.问题 源自星球同学的提问:es如何与hive或mysql结合使用?es不支持事务有什么好的弥补方案吗? 2.事务的核心概念 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下ACID四个 ...

  10. reflect反射

    考虑有这么一个场景:需要根据用户输入url的不同,调用不同的函数,实现不同的操作,也就是一个WEB框架的url路由功能.路由功能是web框架里的核心功能之一,例如Django的urls. 首先,有一个 ...