连通
题意:如果无向图 G每对顶点v和w都有从v到w的路径,那么称无向图G是连通的。现在给定一张无向图,判断它是否是连通的。第一行有 2 个整数 n,m(0<n,m<10^6)。接下来m行每行有 2 个整数u,v表示u和v有边连接。
代码:
//bfs
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
#define MAXN 1000000
vector<int>a[MAXN];
int vis[MAXN];
queue<int>q;
void bfs(int vt){
q.push(vt);
while(q.size()){
int t=q.front();
q.pop();
for(int i:a[t]){
if(!vis[i]){
vis[i]=1;
q.push(i);
}
}
}
}
int main(){
int n,m;
cin>>n>>m;
int u,v;
for(int i=1;i<=m;i++){
cin>>u>>v;
a[u].push_back(v);
a[v].push_back(u);
}
vis[1]=1;
bfs(1);
int flag=0;
for(int i=1;i<=n;i++){
if(vis[i]==0){
flag=1;
}
}
if(flag){
cout<<"no"<<endl;
}else{
cout<<"yes"<<endl;
}
return 0;
}
//DFS
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
#define MAXN 1000000
vector<int>a[MAXN];
int vis[MAXN];
queue<int>q;
void dfs(int vt){
for(int i:a[vt]){
if(!vis[i]){
vis[i]=1;
dfs(i);
}
}
}
int main(){
int n,m;
cin>>n>>m;
int u,v;
for(int i=1;i<=m;i++){
cin>>u>>v;
a[u].push_back(v);
a[v].push_back(u);
}
vis[1]=1;
dfs(1);
int flag=0;
for(int i=1;i<=n;i++){
if(vis[i]==0){
flag=1;
}
}
if(flag){
cout<<"no"<<endl;
}else{
cout<<"yes"<<endl;
}
return 0;
}
//并查集
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
#define MAXN 1000000
vector<int>a[MAXN];
int f[MAXN],n;
void init(){
for(int i=1;i<=n;i++){
f[i]=i;
}
}
int find(int x){
if(x!=f[x]){
f[x]=find(f[x]);
}
return f[x];
}
void combine(int x,int y){
int tx=find(x);
int ty=find(y);
if(tx!=ty){
f[tx]=ty;
}
}
int main(){
int m;
cin>>n>>m;
init();
int u,v;
for(int i=1;i<=m;i++){
cin>>u>>v;
combine(u,v);
}
int cnt=0;
for(int i=1;i<=n;i++){
if(f[i]==i){
cnt++;
}
}
if(cnt==1){
cout<<"yes"<<endl;
}else{
cout<<"no"<<endl;
}
return 0;
}