需要想那么一点点吧 一个连通块中肯定不需要伸进手不拿的情况 不是一个肯定会需要这种情况
然后注意一点 sum=0的时候 就输出0就可以了 不要再减一了
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 vector 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\n");53 else54 printf("%d\n",sum-1+num);55 return 0;56 }