。。。。。。。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
using namespace std;
#define REP(i,s,t) for(int (i)=(s);(i)<=(t);++(i))
#define UREP(i,s,t) for(int (i)=(s);(i)>=(t);--(i))
#define INF 0x7FFFFFFF
const double eps = 1e-10;
const int maxn = 30;
int cnt[maxn][maxn], arr[maxn], a[maxn], b[maxn];
int t[maxn];
int r[maxn], id[maxn];
int n;
double base;
bool cmp(int lhs, int rhs) {
return t[lhs] > t[rhs];
}
void dfs(int now, int tot) {
if (now > tot) {
for (int i=1;i<=n;++i) id[i] = i;
sort(id+1, id+n+1, cmp);
int idx = 1;
r[1] = 1;
for (int i=2;i<=n;++i) {
if (t[id[i]] < t[id[i-1]])
r[id[i]] = (idx = i);
else
r[id[i]] = idx;
}
for (int i=1;i<=n;++i) cnt[i][r[i]]++;
/*
printf("\n");
for (int i=1;i<=n;++i) printf("%d ", t[i]);
printf("\n");
for (int i=1;i<=n;++i) printf("%d ", r[i]);
printf("\n");
printf("\n");
*/
base += 1;
return;
}
int x = a[now], y = b[now];
t[x] = arr[x] + 1;
t[y] = arr[y];
dfs(now+1, tot);
t[x] = arr[x];
t[y] = arr[y] + 1;
dfs(now+1, tot);
}
int main() {
freopen("input.in", "r", stdin);
char buf[10];
while (scanf("%d",&n) && n) {
for (int i=1;i<=n;++i) scanf("%d",&arr[i]);
for (int i=1;i<=n/2;++i) {
scanf("%d-%d",&a[i], &b[i]);
}
memset(cnt, 0, sizeof(cnt));
base = 0;
dfs(1, n/2);
/*
for (int i=1;i<=n;++i) {
for (int j=1;j<=n-1;++j) {
printf("%d ", cnt[i][j]);
}
printf("%d\n", cnt[i][n]);
}*/
//double base = 1;
//cout << base << endl;
for (int i=1;i<=n;++i) {
for (int j=1;j<=n-1;++j) {
printf("%.5f ", (double)cnt[i][j]/base);
}
printf("%.5f\n", (double)cnt[i][n]/base);
}
}
return 0;
}