CF 500 B. New Year Permutation 并查集
User ainta has a permutation p1, p2, ..., pn. As the New Year is coming, he wants to make his permutation as pretty as possible.
Permutation a1, a2, ..., an is prettier than permutation b1, b2, ..., bn, if and only if there exists an integer k (1 ≤ k ≤ n) wherea1 = b1, a2 = b2, ..., ak - 1 = bk - 1 and ak < bk all holds.
As known, permutation p is so sensitive that it could be only modified by swapping two distinct elements. But swapping two elements is harder than you think. Given an n × n binary matrix A, user ainta can swap the values of pi and pj (1 ≤ i, j ≤ n,i ≠ j) if and only if Ai, j = 1.
Given the permutation p and the matrix A, user ainta wants to know the prettiest permutation that he can obtain.
The first line contains an integer n (1 ≤ n ≤ 300) — the size of the permutation p.
The second line contains n space-separated integers p1, p2, ..., pn — the permutation p that user ainta has. Each integer between 1 and n occurs exactly once in the given permutation.
Next n lines describe the matrix A. The i-th line contains n characters '0' or '1' and describes the i-th row of A. The j-th character of the i-th line Ai, j is the element on the intersection of the i-th row and the j-th column of A. It is guaranteed that, for all integers i, j where 1 ≤ i < j ≤ n, Ai, j = Aj, i holds. Also, for all integers i where 1 ≤ i ≤ n, Ai, i = 0 holds.
In the first and only line, print n space-separated integers, describing the prettiest permutation that can be obtained.
7
5 2 4 3 6 7 1
0001001
0000000
0000010
1000001
0000000
0010000
1001000
1 2 4 3 6 7 5
5
4 2 1 5 3
00100
00011
10010
01101
01010
1 2 3 4 5
In the first sample, the swap needed to obtain the prettiest permutation is: (p1, p7).
In the second sample, the swaps needed to obtain the prettiest permutation is (p1, p3), (p4, p5), (p3, p4).
A permutation p is a sequence of integers p1, p2, ..., pn, consisting of n distinct positive integers, each of them doesn't exceed n. The i-th element of the permutation p is denoted as pi. The size of the permutation p is denoted as n.
题意:
给出一个序列,长度为n
然后是n*n的矩阵,矩阵的值为0或者1
maze[i][j]=1表示序列第i个和序列第j个可以交换
maze[i][j]=0表示序列第i个和序列第j个不可以交换
矩阵保证maze[i][j]=maze[j][i]
现在你可以进行操作:若2个数可以交换,你可以交换他们,也可以不交换
你可以操作无限次
问最后得到的最小序列是多少?
2个序列,若第一个不相等的数越小,该序列越小
并查集,把可以交换的那一堆位置的值放在一起
对于序列第i个位置,找到i属于哪一堆,再从这一堆中还没有用过的数中挑出一个最小的数,放在第i的位置。
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; const int maxn=;
const int inf=0x3f3f3f3f;
int ans[maxn][maxn]; //第i堆数的值
int iter[maxn]; //现在第i堆数中要拿的数是第iter[i]个,即这一堆中还没有用过的数中的最小值是第iter[i]个
int fa[maxn]; //并查集
int init[maxn]; //存放初始序列的值
int num[maxn]; //第i个位置属于第num[i]堆
int print[maxn]; //存放最后的序列,方便输出
int len[maxn]; //第i堆数有len[i]个
char str[maxn]; //方便输入数据 int find_fa(int x)
{
if(fa[x]==x)
return x;
else
return fa[x]=find_fa(fa[x]);
} int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
ans[i][j]=inf;
} for(int i=;i<=n;i++)
scanf("%d",&init[i]);
for(int i=;i<=n;i++)
fa[i]=i;
for(int i=;i<=n;i++){
scanf("%s",str);
for(int j=;j<=n;j++){
int u=str[j-]-'';
if(u>){
int fai=find_fa(i);
int faj=find_fa(j);
if(fai!=faj)
fa[faj]=fai;
}
}
}
//printf("eee\n");
for(int i=;i<=n;i++){
len[i]=;
num[i]=-;
}
int tot=;
for(int i=;i<=n;i++){
int cnt=find_fa(i);
if(num[cnt]>){
num[i]=num[cnt];
ans[num[i]][len[num[i]]++]=init[i];
}
else{
num[cnt]=tot;
num[i]=tot;
ans[tot][len[tot]++]=init[i];
tot++;
}
}
for(int i=;i<tot;i++){
sort(ans[i]+,ans[i]+len[i]);
}
for(int i=;i<tot;i++)
iter[i]=;
for(int i=;i<=n;i++){
print[i]=ans[num[i]][iter[num[i]]++];
}
for(int i=;i<n;i++)
printf("%d ",print[i]);
printf("%d\n",print[n]); return ;
}
CF 500 B. New Year Permutation 并查集的更多相关文章
- Educational Codeforces Round 14 D. Swaps in Permutation 并查集
D. Swaps in Permutation 题目连接: http://www.codeforces.com/contest/691/problem/D Description You are gi ...
- Educational Codeforces Round 14 D. Swaps in Permutation (并查集orDFS)
题目链接:http://codeforces.com/problemset/problem/691/D 给你n个数,各不相同,范围是1到n.然后是m行数a和b,表示下标为a的数和下标为b的数可以交换无 ...
- CF # 296 C Glass Carving (并查集 或者 multiset)
C. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- CF 452E. Three strings(后缀数组+并查集)
传送门 解题思路 感觉这种题都是套路之类的??首先把三个串并成一个,中间插入一些奇怪的字符,然后跑遍\(SA\).考虑按照\(height\)分组计算,就是每个\(height\)只在最高位计算一次, ...
- CF 445B DZY Loves Chemistry(并查集)
题目链接: 传送门 DZY Loves Chemistry time limit per test:1 second memory limit per test:256 megabytes D ...
- CF 878E Numbers on the blackboard 并查集 离线 贪心
LINK:Numbers on the blackboard 看完题觉得很难. 想了一会发现有点水 又想了一下发现有点困难. 最终想到了 但是实现的时候 也很难. 先观察题目中的这个形式 使得前后两个 ...
- New Year Permutation(Floyd+并查集)
Description User ainta has a permutation p1, p2, ..., pn. As the New Year is coming, he wants to mak ...
- CF 115 A 【求树最大深度/DFS/并查集】
CF A. Party time limit per test3 seconds memory limit per test256 megabytes inputstandard input outp ...
- CodeForces 691D:Swaps in Permutation(并查集)
http://codeforces.com/contest/691/problem/D D. Swaps in Permutation You are given a permutation of ...
随机推荐
- 1-4-2 Windows数据类型与重要数据结构
主要内容:介绍Windows数据类型与重要数据结构 1.数据类型 在Windows系统中定义了Windows应用程序中包含种类繁多的数据类型, 部分如下: WORD 16位无符号整数 typedef ...
- C 语言中 free() 函数简单分析
又是一个睡不着的夜晚,现在是凌晨03:16,不知道是不是感冒的原因,头脑并不是清醒,但是就是睡不着.摸着黑打开电脑,洗了杯子抓了点茶叶,然后打开饮水机电源.舍友们都睡着了,我戴着耳机听着轻音乐,也能听 ...
- spring源码学习之【准备】jdk动态代理例子
一:被代理的对象所要实现的接口 package com.yeepay.testpoxy; import java.util.Map; /** * 被动态代理的接口 * @author shangxia ...
- docker articles&videos
https://github.com/docker/docker https://channel9.msdn.com/Blogs/containers?page=2 https://blog.dock ...
- powershell samples
1,导出至EXCEL $arr =New-Object System.Collections.ArrayList $i = 1 $pstablelist = @(); $array =get-user ...
- Linux下编译使用boost库:
Boost是什么不多说, 下面说说怎样在Linux下编译使用Boost的所有模块. 1. 先去Boost官网下载最新的Boost版本, 我下载的是boost_1_56_0版本, 解压. 2. 进入解压 ...
- 在CentOS上安装Python
首先我们需要在服务器上安装一个比较新的 Python,CentOS 5.8 默认装的 Python 是 2.4.3. [root@nowamagic ~]# python -V Python 我们需要 ...
- adaptive hash index
An optimization for InnoDB tables that can speed up lookups using = and IN operators, by constructin ...
- 剑指offer(07)-调整数组顺序使奇数位于偶数前面【转】
来源:http://www.acmerblog.com/offer-6-2429/ 题目来自剑指offer系列 九度 1516 题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得 ...
- sqlserver快照,启用基于行版本控制的隔离级别
在sqlserver标准的已提交读(read committed)隔离级别下,读写操作相互阻塞.未提交读(read uncommitted)虽然不会有这种阻塞,但是读操作可能会读到脏数据,这是大部分用 ...