我的想法,找出每个环的边数-1,再累加起来,需要map.

#include<bits/stdc++.h>
using namespace std;
int ans;
bool cmp(int a,int b){
    return a<b;
}

int main(){
    int n,ans=0;
    cin>>n;
    int a[100005],b[100005];
    map<int,int> mp;
    for(int i=0;i<n;++i) {scanf("%d",&a[i]);b[i]=a[i];}
    sort(b,b+n,cmp); 
    for(int i=0;i<n;++i) mp[b[i]]=i;
    for(int i=0;i<n;++i){
        if(mp[a[i]]!=i)
        {int p=mp[a[i]];
        ++ans;
        while(mp[a[p]]!=i){
            ++ans;
            int q=p;
            p=mp[a[p]];
            mp[a[q]]=q;//环中遍历过的元素需要修改位置记录
        }
        mp[a[p]]=p;
        }
    }
    printf("%d\n",ans);
    return 0;
}