B. New Year Permutation
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

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) where a1 = 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 ≤ ni ≠ 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.

Examples
input
75 2 4 3 6 7 10001001000000000000101000001000000000100001001000
output
1 2 4 3 6 7 5
input
54 2 1 5 30010000011100100110101010
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排01串,01串的意思是如果第i行第j列的数字是1,那么上面的数字串里的第i个数字和第j个数字就可以交换位置,题目保证m[i][j] = m[j][i],问你按照这么操作下来(如果m[i][j] = 1,那么A[i]与A[j]可交换,也可不交换),能得到的数字串最小的字典序是多少

思路:dfs

#include <iostream>
using namespace std;

int m[400][400];
int g[400];
bool vis[400];
int x;
int t,it;
bool flag[400];
int w[400];
//dfs的目的是得到x可以的最小值
void dfs( int a ){
	if( !vis[g[a]] ){//如果说g[a]没有遍历过,那么取小的值
		x = min( x,g[a] );
	}
	w[a] = it;//然后第a个数字,就用过了,防止下面出现死循环
	for( int i = 0; i < t; i++ ){
		if( m[a][i] == 1 and w[i] != it ){//搜索可能出现的最小值
			dfs(i);
		}
	}
}

int main(){
	cin >> t;
	for( int i = 0; i < t; i++ ){
		scanf("%d",&g[i]);
	}
	for( int i = 0; i < t; i++ ){
		for( int j = 0; j < t; j++ ){
			scanf("%1d",&m[i][j]);
		}
	}
	for( int i = 0; i < t; i++ ){
		it++;//记录是第几个数字
		x = t;//先令x的序号为最大
		dfs(i);
		vis[x] = true;
		printf("%d ",x);
	}
}

好多大佬用的是floyd算法,仔细研究了一下dalao的代码,受益匪浅啊~

#include <iostream>
using namespace std;
const int maxn = 400;
bool vis[maxn];
int A[maxn],m[maxn][maxn];
int a;
int pos[maxn];

int main(){
	cin >> a;
	for( int i = 1; i <= a; i++ ){
		cin >> A[i];
		pos[A[i]] = i;//离散化,这不操作可以即可以根据数字找到位置,也可以根据位置找到数字
	}
	for( int i = 1; i <= a; i++ ){
		for( int j = 1; j <= a; j++ ){
			scanf("%1d",&m[i][j]);
		}
		m[i][i] = 1;//自己与自己交换是被允许的
	}

	for( int k = 1; k <= a; k++ ){// floyd一下
		for( int i = 1; i <= a; i++ ){
			for( int j = 1; j <= a; j++ ){
				if( m[i][k] == 1 and m[k][j] == 1 ){
					m[i][j] = 1;
				}
			}

		}
	}
	//i代表i号位置,j代表数字j
	for( int i = 1; i <= a; i++ ){//这个循环是循环数组
		for( int j = 1; j <= a; j++ ){
			if( m[i][pos[j]] == 1 and !vis[j] ){//因为pos[j]是j的位置,j又是从小到达的,这步贪心
				cout << j << " ";
				vis[j] = true;//j这个数字用过了
				pos[A[i]] = pos[j];//改变A[i]的位置为j的位置(A[i]与j位置互换)
				pos[j] = i;//j的位置变成了i
				break;
			}
		}
	}
}

codeforces 508B的更多相关文章

  1. 【codeforces 508B】Anton and currency you all know

    [题目链接]:http://codeforces.com/contest/508/problem/B [题意] 给你一个奇数; 让你交换一次数字; 使得这个数字变成偶数; 要求偶数要最大; [题解] ...

  2. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  3. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  4. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  5. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  6. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  7. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  8. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  9. CodeForces - 696B Puzzles

    http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...

随机推荐

  1. mysql 表映射为java bean 手动生成。

    在日常工作中,一般是先建表.后建类.当然也有先UML构建类与类的层级关系,直接生成表.(建模)这里只针对先有表后有类的情况.不采用代码生成器的情况. 例如: 原表结构: ),)) BEGIN ); ) ...

  2. 格式化hdfs后,hadoop集群启动hdfs,namenode启动成功,datanode未启动

    集群格式化hdfs后,在主节点运行启动hdfs后,发现namenode启动了,而datanode没有启动,在其他节点上jps后没有datanode进程!原因: 当我们使用hdfs namenode - ...

  3. Music Recommendation System with User-based and Item-based Collaborative Filtering Technique(使用基于用户及基于物品的协同过滤技术的音乐推荐系统)【更新】

    摘要: 大数据催生了互联网,电子商务,也导致了信息过载.信息过载的问题可以由推荐系统来解决.推荐系统可以提供选择新产品(电影,音乐等)的建议.这篇论文介绍了一个音乐推荐系统,它会根据用户的历史行为和口 ...

  4. 异步请求Ajax(取得json数据)

    异步请求Ajax 没有学习Ajax之前请求数据的时候都是整个页面全部刷新了一次,也就是每次请求都会重新请求所有的资源.但是在很多时候不需要页面全部刷新,仅仅是需要页面的局部数据刷新即可,此时需要发送异 ...

  5. jq动画分析1

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. request设置cookies

    mycookie = { "PHPSESSID":"56v9clgo1kdfo3q5q8ck0aaaaa" } request.get(url,cookies ...

  7. java MD5/AES/DES加解密汇总

    package com.test.test1.util; import java.security.MessageDigest; import java.security.SecureRandom; ...

  8. es6入门set和map

    ES6提供了新的数据结构Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化. var set = new Set([1, ...

  9. 判断URL是否能被链接

    判断url是否能被正确链接 function checkUrl(url, name) { $.ajax({ url: url, type: "get", dataType : 'j ...

  10. 简单实用的分页类-python

    django自带的分页虽然挺好,但是就想自己弄个通用的 自己写了个分页的类,用的是python,   其他语言改下语法就能用了. #定义好类.class pagemanage: def __init_ ...