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 ...
随机推荐
- jquery 按回城 等于提交按钮
$(document).keydown(function(e){ if(e.keyCode==13){ $('.bu ...
- Java中将16进制字符串转换成汉字
技术交流群:233513714 /** * 将16进制字符串转换成汉字 * @param str * @return */ public static String deUnicode(String ...
- CentOS 6.0修改ssh远程连接端口
转自:系统运维 » CentOS 6.0修改ssh远程连接端口 实现目的:把ssh默认远程连接端口修改为2222 方法如下: 1.编辑防火墙配置:vi /etc/sysconfig/iptables ...
- Git图文教程:从零到上传GitHub项目
一:安装Git 从Git官网下载.安装客户端 二:本地建立代码仓库 在开始菜单中找到 Git Bash 并打开 配置身份 git config --global user.name "pen ...
- OCR文字识别软件 怎么识别包含非常规符号的文本
ABBYY FineReader 12 是一款OCR图文识别软件,可快速方便地将扫描纸质文档.PDF文件和数码相机的图像转换成可编辑.可搜索的文本,有时文本中可能会包含一些非常规的符号,此时ABBYY ...
- SQL Server中数据库文件的存放方式,文件和文件组
原文地址:http://www.cnblogs.com/CareySon/archive/2011/12/26/2301597.html SQL Server中数据库文件的存放方式,文件和文件组 ...
- CSS3盒模型之box-sizing
这些天在做一个手机端的页面,遇到了一些问题!首当其冲的就是盒子的溢出问题!大家都知道,手机的尺寸各异,各种型号的手机多得能闪瞎你们的眼睛,为了能 让这些设置更好的浏览我们的页面,我们已经不能固定页面的 ...
- USACO/gift1
描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少. 在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人. 然而,在任何一群朋友中 ...
- Advancing The Realtime Web With RethinkDB
RethinkDB is an open-source distributed database built to store JSON and scale with very little effo ...
- ANDROID中获取STRING.XML,DIMENS.XML等资源文件中的值
一:是为了国际化,当需要国际化时,只需要再提供一个string.xml文件,把里面的汉子信息都修改为对应的语言(如,English),再运行程序时,android操作系统会根据用户手机的语言环境和国家 ...