UVA11330 Andy's Shoes —— 置换分解

题目链接: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 }
View Code
原文地址:https://www.cnblogs.com/DOLFAMINGO/p/8538759.html