需要想那么一点点吧 一个连通块中肯定不需要伸进手不拿的情况 不是一个肯定会需要这种情况
然后注意一点 sum=0的时候 就输出0就可以了 不要再减一了
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 using namespace std; 8 vector<int>ed[510]; 9 int a[510][55],vis[510],de[510]; 10 void dfs(int u) 11 { 12 int i; 13 for(i = 0 ; i < (int)ed[u].size() ; i++) 14 { 15 int v = ed[u][i]; 16 if(!vis[v]) 17 { 18 vis[v] = 1; 19 dfs(v); 20 } 21 } 22 } 23 int main() 24 { 25 int i,j,n,m; 26 int num=0; 27 scanf("%d%d",&n,&m); 28 for(i = 1 ; i <= n ;i++) 29 for(j = 1; j <= m ; j++) 30 { 31 scanf("%d",&a[i][j]); 32 if(a[i][j]!=i) 33 { 34 num++; 35 de[i]++; 36 ed[i].push_back(a[i][j]); 37 ed[a[i][j]].push_back(i); 38 } 39 } 40 41 int sum=0; 42 for(i = 1; i <= n ; i++) 43 { 44 if(de[i]&&!vis[i]) 45 { 46 sum++; 47 vis[i] = 1; 48 dfs(i); 49 } 50 } 51 if(sum==0) 52 printf("0 "); 53 else 54 printf("%d ",sum-1+num); 55 return 0; 56 }