题目链接:https://vjudge.net/problem/UVA-11330
题意:
给出n双鞋子,鞋子按左右左右地摆放,但“左右”是否为一对鞋子是不确定的。问:至少交换多少次鞋子,才能把每双鞋子都放好。
题解:
1.可知,对于“左”鞋子是不需要调整的,只需调整“右”鞋子,使得它们都各自放到了相应“左”鞋子的右边。
2.因此,可以把右鞋子的摆放情况看成是置换。然后对置换进行分解,求出循环节cnt,则只需交换n-cnt次。
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <vector> 6 #include <cmath> 7 #include <queue> 8 #include <stack> 9 #include <map> 10 #include <string> 11 #include <set> 12 using namespace std; 13 typedef long long LL; 14 const int INF = 2e9; 15 const LL LNF = 9e18; 16 const int MOD = 1e9+7; 17 const int MAXN = 2e4+10; 18 19 bool vis[MAXN]; 20 int A[MAXN]; 21 int main() 22 { 23 int T, kase = 0, n; 24 scanf("%d", &T); 25 while(T--) 26 { 27 scanf("%d",&n); 28 memset(vis, true, sizeof(vis)); 29 for(int i = 1; i<=n; i++) 30 { 31 int l, r; 32 scanf("%d%d", &l,&r); 33 A[l] = r; 34 vis[l] = false; 35 } 36 37 int cnt = 0; 38 for(int i = 1; i<MAXN; i++) 39 { 40 if(!vis[i]) 41 { 42 int j = i; 43 cnt++; 44 do 45 { 46 vis[j] = true; 47 j = A[j]; 48 }while(j!=i); 49 } 50 } 51 printf("%d ", n-cnt); 52 } 53 }