【Good Bye 2014B】【Floyd or 并查集】New Year Permutation 全排列有位置交换序列 使得字典序尽可能小
来源:互联网 发布:背身护球 知乎 编辑:程序博客网 时间:2024/06/07 04:45
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 ifAi, 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 1and 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 thei-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 where1 ≤ 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.
75 2 4 3 6 7 10001001000000000000101000001000000000100001001000
1 2 4 3 6 7 5
54 2 1 5 30010000011100100110101010
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. Thei-th element of the permutation p is denoted as pi. The size of the permutation p is denoted as n.
#include<stdio.h>#include<iostream>#include<string.h>#include<string>#include<ctype.h>#include<math.h>#include<set>#include<map>#include<vector>#include<queue>#include<bitset>#include<algorithm>#include<time.h>using namespace std;void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }#define MS(x,y) memset(x,y,sizeof(x))#define MC(x,y) memcpy(x,y,sizeof(x))#define MP(x,y) make_pair(x,y)#define ls o<<1#define rs o<<1|1typedef long long LL;typedef unsigned long long UL;typedef unsigned int UI;template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b>a)a = b; }template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b<a)a = b; }const int N = 303, M = 0, Z = 1e9 + 7, ms63 = 0x3f3f3f3f;int a[N], p[N];char s[N][N];int n;bool use[N];int ans[N];int main(){while (~scanf("%d", &n)){for (int i = 1; i <= n; ++i){scanf("%d", &a[i]);p[a[i]] = i;}for (int i = 1; i <= n; ++i){scanf("%s", s[i] + 1);s[i][i] = '1';}for (int k = 1; k <= n; ++k){for (int i = 1; i <= n; ++i){for (int j = 1; j <= n; ++j){if (s[i][k] == '1'&&s[k][j] == '1')s[i][j] = '1';}}}MS(use, 0);for (int i = 1; i <= n; ++i){for (int j = 1; j <= n; ++j)if(!use[j]&&s[i][p[j]]=='1'){ans[i] = j;use[j] = 1;p[j] = i;p[a[i]] = p[j];break;}}for (int i = 1; i <= n; ++i)printf("%d ", ans[i]);puts("");}return 0;}/*【题意】给你一个长度为n(300)的全排列。同时给你一个n*n的01矩阵s[][]我们可以交换两个数,当且仅当它们所在的的下标i,j对应着的s[i][j]为1。问你我们可以得到的最小字典序的排列【类型】floyd【分析】这题可以用floyd做。我们对矩阵做闭包传递的floyd。(或者——并查集)那么,任意两个位置的数是否可以交换我们就知道了。这个类似于冒泡排序的过程,只要有一个交换链存在,任意一个数都可以位移到它想要的位置。于是这种做法是可行的。就可以AC啦。【时间复杂度&&优化】O(n^3)【数据】*/
- 【Good Bye 2014B】【Floyd or 并查集】New Year Permutation 全排列有位置交换序列 使得字典序尽可能小
- Good Bye 2014 B. New Year Permutation(并查集 ||Floyd )
- Good Bye 2014 B. New Year Permutation 并查集 最短路 floyed算法
- Good Bye 2014--B. New Year Permutation
- Good Bye 2014 B. New Year Permutation
- cf 500B New Year Permutation 【并查集】or【floyd】
- CodeForces 500B Good Bye 2014 New Year Permutation
- CF~Good Bye 2014 B. New Year Permutation
- Codeforces 500B:New Year Permutation(并查集||Floyd+思维)
- New Year Permutation(Floyd+并查集)
- Good Bye 2013---B. New Year Present
- Good Bye 2014 E. New Year Domino
- Good Bye 2014--A. New Year Transportation
- 500B New Year Permutation(Floyd)
- codeforces Good Bye 2016-B New Year and North Pole
- Good Bye 2014 B.(Floyd+暴力)
- New Year Permutation(并查集+动态容器)
- CF500B New Year Permutation (贪心+并查集)
- BestCoder Round #76
- Js基础回顾 - 函数作用域及js oop(1)
- 天声人語 20160321 春の空は気まぐれで
- Python笔记——类定义
- LinkedList其实就那么一回事儿之源码浅析
- 【Good Bye 2014B】【Floyd or 并查集】New Year Permutation 全排列有位置交换序列 使得字典序尽可能小
- Laravel 调试利器 —— Laravel Debugbar 扩展包安装及使用教程(转)
- CodeForces 452C - Magic Trick-概率
- 日经春秋 20160321
- 【Good Bye 2014C】【脑洞】New Year Book Reading 书放一摞依次看 最佳顺序使费用最小
- PTA基础编程 5-15 计算圆周率 (15分)
- Java排序算法(一)--快速排序(QuickSort)
- 【Good Bye 2014D】【期望的线性可加 基本元素累计】New Year Santa Network 树上取3点,路径权值之和的期望
- sql的case语句