问题 B: 连通图
题目描述
给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。
输入
每组数据的第一行是两个整数 n 和 m(0<=n<=1000)。n 表示图的顶点数目,m 表示图中边的数目。如果 n 为 0 表示输入结束。随后有 m 行数据,每行有两个值 x 和 y(0<x, y <=n),表示顶点 x 和 y 相连,顶点的编号从 1 开始计算。输入不保证这些边是否重复。
输出
对于每组输入数据,如果所有顶点都是连通的,输出"YES",否则输出"NO"。
样例输入 Copy
4 3 4 3 1 2 1 3 5 7 3 5 2 3 1 3 3 2 2 5 3 4 4 1 7 3 6 2 3 1 5 6 0 0
样例输出 Copy
YES YES NO
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxv = 1010;
int n, m, ans;
vector<int> edge[maxv];
bool visit[maxv] = {false};
/*深度优先*/
void DFS(int u, int depth){
visit[u] = true;
for(int i=0; i<edge[u].size(); i++){
int v = edge[u][i];
if(visit[v]==false){
DFS(v, depth+1);
}
}
}
void DFSTravel(){
for(int u=1; u<=n; u++){
if(visit[u]==false){
DFS(u, 1);
ans++;
}
}
}
/*广度优先*/
void BFS(int u){
queue<int> q;
q.push(u);
visit[u] = true;
while(!q.empty()){
int top = q.front();
q.pop();
for(int i=0; i<edge[top].size(); i++){
int v = edge[top][i];
if(visit[v]==false){
q.push(v);
visit[v] = true;
}
}
}
}
void BFSTravel(){
for(int u=0; u<=n; u++){
if(visit[u]==false){
BFS(u);
ans++;
}
}
}
void init(){
memset(visit, false, sizeof(visit));
for(int i=0; i<maxv; i++){
edge[i].clear();
}
ans = 0;
}
int main(){
while(scanf("%d%d", &n, &m)&&n!=0){
init();// 每次循环前初始化
for(int i=0; i<m; i++){
int a, b;
scanf("%d%d", &a, &b);
edge[a].push_back(b);
edge[b].push_back(a);
}
DFSTravel();/*深度*/
BFSTravel();/*广度*/
if(ans==1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}