案例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; }
勤能补拙,熟能生巧