2 3 1 1 2 3 2 3 2 1 2
2 1
但正是在前面算法的基础上进行的修改,最后就是DFS 求路径的条数!唉,这种题以后不能马虎啦!!!
一开始竟然是这么想的: 结果=总的点数n - 未被访问的点 + dfs路径数 , 发现程序跑完样例的结果偏大!
其实这么想的原因自己也知道了,因为我开始想错了,dfs如果遇到一个点的路径时也要+1,这个地方我想错了!
以后继续多多使用dfs, 禁止此类错误的重犯! 修改完代码后,测试样例通过,提交一遍Accepted了!
注意:借助此题加深对连通分量(离散数学的知识点)的记忆和理解 ! comn on ! ! !
代码如下:
#include <stdio.h>
#include <string.h>
int n, m;
int map[50][50];
int vt[50];
int cnt; //记录连通分量的个数
void dfs(int u)
{
vt[u]=1; //标记该点访问
int i;
for(i=1; i<=n; i++)
{
if( !vt[i] && map[u][i]==1 )
{
vt[i]=1;
dfs(i);
}
}
}
// dfs的路径数
int main()
{
int t;
int i, j, k;
int u, v;
scanf("%d", &t);
while(t--)
{
scanf("%d %d", &n, &m);
memset(map, 0, sizeof(map));
cnt=0; //数据初始化
memset(vt, 0, sizeof(vt));
for(i=0; i<m; i++)
{
scanf("%d %d", &u, &v );
map[u][v] = 1;
map[v][u] = 1;
}
for(j=1; j<=n; j++)
{
if(!vt[j] )
{
dfs(j);
cnt++;
}
}
printf("%d\n", cnt );
}
return 0;
}
原文:http://www.cnblogs.com/yspworld/p/3937588.html