案例7-1.5 与零交换 (25分)--dfs

//用连通分量dfs
//环1:0->3->2->7->0
//交换a[0]=0<->a[1]=5
//环2:0->5->4->6->9->1->0
#include <stdio.h>
int d[100001]= {0},a[100001]= {0};
void dfs(int x) {
    d[x]=0;
    x=a[x];
    if(!x)return;
    dfs(x);
}
int main() {
    int n,k=0,i;
    scanf("%d",&n);
    for(i=0; i<n; i++) {
        scanf("%d",&a[i]);
        if(a[i]!=i) {
            d[i]=1;
            k++;
        }
    }
    if(!d[0])k++;
    for(i=0; i<n; i++) {
        if(d[i]) {
            if(!d[0]) {
                a[0]=a[i];
                a[i]=0;
                d[0]=1;
                k++;
            }
            dfs(0);
        }
    }
    printf("%d",k-1);
    return 0;
}
 
勤能补拙,熟能生巧
原文地址:https://www.cnblogs.com/snzhong/p/12410499.html