Given any permutation of the numbers {0, 1, 2,…, N−1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the swap operations in the following way:
Swap(0, 1) => {4, 1, 2, 0, 3}
Swap(0, 3) => {4, 1, 2, 3, 0}
Swap(0, 4) => {0, 1, 2, 3, 4}
Now you are asked to find the minimum number of swaps need to sort the given permutation of the first N nonnegative integers.
Input Specification:
Each input file contains one test case, which gives a positive N (≤10
5
) followed by a permutation sequence of {0, 1, …, N−1}. All the numbers in a line are separated by a space.
Output Specification:
For each case, simply print in a line the minimum number of swaps need to sort the given permutation.
Sample Input:
10
3 5 7 2 6 4 9 0 8 1
Sample Output:
9
#include <stdio.h>
int main(){
int N;
int i;
int cnt, cntwhile, tmpA, tmpT, tmp, tmpi;
int flag=0;
scanf("%d", &N);
int A[N],T[N];
for (i=0; i<N; i++){
scanf("%d", &A[i]);
T[A[i]]=i;
}
cnt = 0;
for (i=0; i<N; i++){
tmpi = i;
flag = 0; cntwhile = 0;
tmp = A[i];
if( A[i] != i){
while(1){
cntwhile++;
if( i==0 ) flag = 1;
if(A[T[i]] == T[i]) {
A[i] = tmp;
T[i] = i;
break;
}
tmpT = T[i];
A[i] = A[T[i]];
T[i] = i;
i = tmpT;
}
if (flag == 1 && cntwhile != 0) cntwhile--;
else cntwhile++;
cnt += cntwhile;
}
i = tmpi;
}
printf("%d", cnt);
return 0;
}