标签:
题目:有双配对出错鞋子,要求最少的交换次数,使得鞋子配对摆放。
分析:组合数学,置换群。统计置换中循环的个数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; }
标签:
原文地址:http://blog.csdn.net/mobius_strip/article/details/46141547