1124. Mosaic(dfs)

1124

需要想那么一点点吧 一个连通块中肯定不需要伸进手不拿的情况 不是一个肯定会需要这种情况 

然后注意一点 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 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3362126.html