松鼠排序
题目
松鼠宝宝有一排n个大小不一的坚果,松鼠宝宝想把坚果从小到大排序,每次他会选择两个坚果a和b每次花费1点力气把这两个坚果交换,爱动脑筋的松鼠宝宝想知道他排完这n个坚果一共需要花费的最少力气是多少?
思路
index 1 2 3 4 5 6 7
value 7 3 5 2 4 1 6 将位子和其对应的数字想象成一个图
1 -> 7 -> 6 -> 1
2 -> 3 -> 5 -> 4 -> 2 其必然形成一个环状(相当于n个点n条边
有可能是好几个环,将如上例就是两个环 ,答案就是每个环边数-1后再相加
代码
int vis[N],a[N];
void solve()
{
int n,res=0;
cin >> n;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<n;i++)
{
if(vis[i]) continue;
int cnt = 0;
int x = i;
while(!vis[x])
{
vis[x] = 1;
x = a[x];
cnt++;
}
res += cnt-1;
}
cout << res;
}