单点时限: 3.0 sec
内存限制: 256 MB
如果无向图 G 每对顶点 v 和 w 都有从 v 到 w 的路径,那么称无向图 G 是连通的。现在给定一张无向图,判断它是否是连通的。
输入格式
第一行有 2 个整数 n,m (0<n,m<106)。
接下来 m 行每行有 2 个整数 u,v (1≤u,v≤n) 表示 u 和 v 有边连接。
输出格式
如果无向图是连通的输出 yes,否则输出 no。
样例
input
4 6
1 2
2 3
1 3
4 1
2 4
4 3
output
yes
提示
回忆图的遍历算法。
BFS
/*
思路:bfs dfs均可以。只要任意一顶点出发能够访问到n-1个顶点,图就是无向连通图。
*/
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
vector<int>v[100001];
queue<int>q;
int visit[1000001];
int n,m;
bool bfs(int index) {
memset(visit,0,sizeof(visit));
visit[index]=1;
for(int i =0; i < v[index].size(); i++)
q.push(v[index][i]),visit[v[index][i]]=1;
int ans=v[index].size();
while(!q.empty()) {
int f=q.front();
q.pop();
for(int i = 0; i < v[f].size(); i++) {
if(visit[v[f][i]]==0) {
q.push(v[f][i]);
visit[v[f][i]]=1;
ans++;
}
}
}
if(ans==n-1)
return true;
return false;
}
int main() {
cin>>n>>m;
int flag=0;
for(int i = 0; i < m; i++) {
int x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
if(bfs(1))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
return 0;
}
DFS:
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
vector<int>v[100001];
queue<int>q;
int visit[1000001]= {0};
int n,m;
int ans=0;
void dfs(int index) {
for(int i = 0; i < v[index].size(); i++) {
if(visit[v[index][i]]==0) {
ans++;
visit[v[index][i]]=1;
dfs(v[index][i]);
}
}
}
int main() {
cin>>n>>m;
int flag=0;
for(int i = 0; i < m; i++) {
int x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
visit[1]=1;
dfs(1);
if(ans==n-1)
cout<<"yes";
else
cout<<"no";
return 0;
}