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\n");

53     else

54     printf("%d\n",sum-1+num);

55     return 0;

56 }
View Code

 

你可能感兴趣的:(OS)