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.

Input

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 ≤ nAi, j = Aj, i holds. Also, for all integers i where 1 ≤ i ≤ nAi, i = 0 holds.

Output

In the first and only line, print n space-separated integers, describing the prettiest permutation that can be obtained.

Sample test(s)
input
7
5 2 4 3 6 7 1
0001001
0000000
0000010
1000001
0000000
0010000
1001000
output
1 2 4 3 6 7 5
input
5
4 2 1 5 3
00100
00011
10010
01101
01010
output
1 2 3 4 5
Note

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 并查集的更多相关文章

  1. Educational Codeforces Round 14 D. Swaps in Permutation 并查集

    D. Swaps in Permutation 题目连接: http://www.codeforces.com/contest/691/problem/D Description You are gi ...

  2. Educational Codeforces Round 14 D. Swaps in Permutation (并查集orDFS)

    题目链接:http://codeforces.com/problemset/problem/691/D 给你n个数,各不相同,范围是1到n.然后是m行数a和b,表示下标为a的数和下标为b的数可以交换无 ...

  3. CF # 296 C Glass Carving (并查集 或者 multiset)

    C. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  4. CF 452E. Three strings(后缀数组+并查集)

    传送门 解题思路 感觉这种题都是套路之类的??首先把三个串并成一个,中间插入一些奇怪的字符,然后跑遍\(SA\).考虑按照\(height\)分组计算,就是每个\(height\)只在最高位计算一次, ...

  5. CF 445B DZY Loves Chemistry(并查集)

    题目链接: 传送门 DZY Loves Chemistry time limit per test:1 second     memory limit per test:256 megabytes D ...

  6. CF 878E Numbers on the blackboard 并查集 离线 贪心

    LINK:Numbers on the blackboard 看完题觉得很难. 想了一会发现有点水 又想了一下发现有点困难. 最终想到了 但是实现的时候 也很难. 先观察题目中的这个形式 使得前后两个 ...

  7. New Year Permutation(Floyd+并查集)

    Description User ainta has a permutation p1, p2, ..., pn. As the New Year is coming, he wants to mak ...

  8. CF 115 A 【求树最大深度/DFS/并查集】

    CF A. Party time limit per test3 seconds memory limit per test256 megabytes inputstandard input outp ...

  9. CodeForces 691D:Swaps in Permutation(并查集)

    http://codeforces.com/contest/691/problem/D D. Swaps in Permutation   You are given a permutation of ...

随机推荐

  1. POJ 1469 COURSES(二部图匹配)

                                                                     COURSES Time Limit: 1000MS   Memory ...

  2. 越狱Season 1-Season 1, Episode 3: Cell Test

    Season 1, Episode 3: Cell Test -CO: Oh, my God. 我的天 Williamson, get in here. Williamson 快进来 What the ...

  3. libGraphicsMagickWand.so: cannot open shared object file: No such file or directory stack traceback:

    参考博文:http://www.linuxidc.com/Linux/2016-07/133213.htm ==>> Check Passed, the num of bbox and f ...

  4. lua操作常用函数学习一

    (1)lua 和 C++之间的交互的基本知识: lua 和 C++ 之间的数据交互通过堆栈进行,栈中的数据通过索引值进行定位,(栈就像是一个容器一样,放进去的东西都要有标号)其中栈顶是-1,栈底是1, ...

  5. Logistic回归的牛顿法及DFP、BFGS拟牛顿法求解

    牛顿法 # coding:utf-8 import matplotlib.pyplot as plt import numpy as np def dataN(length):#生成数据 x = np ...

  6. C#中的static、readonly与const的比较

    C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景. 工作原理     readonly为运行时常量,程序运 ...

  7. Vs 2015 中一些新的语法支持

    又是语法糖. 1, if (tdata != null && tdata.Data != null) 等价于   if (tdata?.Data != null)   2, int a ...

  8. Windows Azure 生成证书

    C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64>makecert -sky exchange -r -n &qu ...

  9. PHP5.3以上版本没有libmysql.dll,以及由此带来的困扰

    有朋友下载了PHP5.3,PHP5.4版本想加载mysql支持的时候发现没有libmysql.dll文件,无法完成mysql配置,其实PHP5.3版本开始,使用mysqlnd库,不再使用libmysq ...

  10. SqlParameter设定的value值为0时、调用的存储过程获取到的值却为null解决方法

    原C#代码如下: if (query != null) { switch (query.MethodFlag) { //进出口退补税额统计表 case (int)EnumClassifyCorrect ...