题目:有双配对出错鞋子,要求最少的交换次数,使得鞋子配对摆放。
分析:组合数学,置换群。统计置换中循环的个数k,则结果为n-k。
循环内部(设有m个元素)需要交换m-1次(除最后一次,每次交换最多只能有一个复位)
说明:注意鞋子的编号不一定是1~n,是1~10000之间的数字,计算时需要做映射。
#include <cstdlib>
#include <cstdio>
int value[10011];
int Lshoes[10011];
int Rshoes[10011];
int visit[10011];
int main()
{
int t,n;
while (~scanf("%d",&t))
while (t --) {
scanf("%d",&n);
for (int i = 1; i <= n; ++ i) {
scanf("%d%d",&Lshoes[i],&Rshoes[i]);
visit[i] = 0;
}
//将数据映射到1~n
int id = 0;
for (int i = 1; i <= n; ++ i)
value[Lshoes[i]] = ++ id;
for (int i = 1; i <= n; ++ i)
Rshoes[i] = value[Rshoes[i]];
//计算置换中循环的个数
int count = 0;
for (int i = 1; i <= n; ++ i)
if (!visit[i]) {
++ count;
visit[i] = 1;
int now = Rshoes[i];
while (!visit[now]) {
visit[now] = 1;
now = Rshoes[now];
}
}
printf("%d\n",n-count);
}
return 0;
}