#define _CRT_SECURE_NO_WARNINGS #include #include using namespace std; int N, K, tem, p[401]; int cost_pos, cost_val; int cp[401][401], cv[401][401]; struct result { int i, j; }res[1000000]; struct min_cost { int i, j, val; bool operator < (const min_cost &a) const { return (this->val > a.val); } }mc[401]; void Input() { FILE *in = fopen("sorting.in", "r"); fscanf(in, "%i", &N); for (int i = 1; i <= N; i++) { fscanf(in, "%i", &p[i]); } fscanf(in, "%i", &cost_pos); for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { fscanf(in, "%i", &cp[i][j]); } } fscanf(in, "%i", &cost_val); for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { fscanf(in, "%i", &cv[i][j]); } } } void SetMinCost() { for (int i = 1; i <= N; i++) { if (p[i] == i) continue; for (int j = 1; j <= N; j++) { if (p[j] == i) { tem++; mc[tem].i = i; mc[tem].j = j; mc[tem].val = cp[i][j] + cv[p[i]][p[j]]; break; } } } } void solve() { int t, new_swap; SetMinCost(); sort(&mc[1], &mc[tem + 1]); for (int k = 1; k <= N; k++) { if (tem == 0) return; K++; res[K].i = mc[tem].i; res[K].j = mc[tem].j; t = p[mc[tem].j]; p[mc[tem].j] = p[mc[tem].i]; p[mc[tem].i] = t; tem = 0; SetMinCost(); sort(&mc[1], &mc[tem + 1]); } } void Output() { FILE *out = fopen("sorting.out", "w"); fprintf(out, "%i\n", K); for (int k = 1; k <= K; k++) { fprintf(out, "%i %i\n", res[k].i, res[k].j); } } int main() { Input(); solve(); Output(); return 0; }