- 题目描述:
- 给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。
- 输入:
- 每组数据的第一行是两个整数 n 和 m(0<=n<=1000)。n 表示图的顶点数目,m 表示图中边的数目。如果 n 为 0 表示输入结束。随后有 m 行数据,每行有两个值 x 和 y(0<x, y <=n),表示顶点 x 和 y 相连,顶点的编号从 1 开始计算。输入不保证这些边是否重复。
- 输出:
- 对于每组输入数据,如果所有顶点都是连通的,输出”YES”,否则输出”NO”。
- 样例输入:
-
4 3 1 2 2 3 3 2 3 2 1 2 2 3 0 0
- 样例输出:
-
NO YES
====================================
这两天弄几道简单的做做…
这个是图联通的检测,可以用DFS或者BFS做,其实函数给个int返回值,返回这个节点标记了几个,这样后面main函数里面就不用再遍历一次visited数组了~
发现以前申请的空间都不delete的,现在感觉就像便便了没擦屁股一样…
调试出来第一遍发现怎么都不对,后来细看发现申请出来的二维数组没有初始化…噗
呐,如果是BFS的话,按照数据结构书上讲,用队列来搞,不用递归就行了。把本层访问到的节点塞到工作队列中就行..
====================================
#include
using namespace std;
void DFS( bool **connMatrix, bool *visited, int N, int c)
{
//connMatrix: 连通矩阵
//visited :是否访问
//N : 节点数
//c : 当前节点编号
visited[c] = true; //Mark current node as visited
int i;
for(i=0; i
{
cin >> M;
//Create matrix and visited
bool **connMat = new bool*[N];
bool *visited = new bool[N];
int i;
for(i=0; i
x--;
y--; //Subscript starts from 1 in the input
connMat[x][y] = true;
connMat[y][x] = true;
}
//Manipulate
DFS(connMat, visited, N, 0);
bool flag = true;
for(i=0; i