连通图--BFS和DFS

题目描述
给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。

输入描述:
每组数据的第一行是两个整数 n 和 m(0<=n<=1000)。n 表示图的顶点数目,m 表示图中边的数目。随后有 m 行数据,每行有两个值 x 和 y(0

输出描述:
对于每组输入数据,如果所有顶点都是连通的,输出"YES",否则输出"NO"。

输入
4 3
1 2
2 3
3 2
3 2
1 2
2 3
0 0

输出
NO
YES

  • 并查集略微复杂,判断图的连通性其实可以用遍历来做。
  • 基本思想:用邻接矩阵存储图。首先进行初始化,然后每接收一条边,就把对应的点设为连通(true)。
  • 设置完了之后就开始从第一个顶点开始判断:
  • 代码一不使用BFS,但是和BFS的思想大致相同,即从第一个点开始(push),先访问第一个点,扫描和这一个点连通的剩余端点,如果这个端点未被访问,则访问(push)这个点。
#include
#include

using namespace std;

const int M=1001;
bool G[M][M];
bool visit[M]

void Visit(int n,int x){
 visit[x]=true;
 for(int i=1;i<=n;i++){
  if(G[i][x]&&!visit[i])
   Visit(n,i);
 }
}

int main(){
 int n,m;
 while(cin>>n>>m&&n&&m){
  for(int i=1;i<=n;i++){
   visit[i]=false;
   for(int j=1;j<=n;j++)
    G[i][j]=false;
  }
  int x,y;
  while(m--){
   cin>>x>>y;
   G[x][y]=G[y][x]=false;
  }
  Visit(n,1);
  bool ans=true;
  for(int i=1;i<=n;i++)
   if(!visit[i])
    ans=false;
  if(ans)
   cout<<"YES"<<endl;
  else
   cout<<"NO"<<endl;
 }
 return 0;
}
  • BFS
#include
#include
#include

using namespace std;

const int M=1001;
bool G[M][M];
bool visit[M];
queue<int> q;

void BFS(int n){
 q.push(1);
 while(!q.empty()){
  int i=q.front();
  q.pop();
  visit[i]=true;
  for(int j=1;j<=n;j++)
   if(G[i][j]&&!visit[j]){
    visit[j]=true;
    q.push(j);
   }
 }
}

int main(){
 int n,m;
 while(cin>>n>>m&&n&&m){
  for(int i=1;i<=n;i++){
   visit[i]=false;
   for(int j=1;j<=n;j++)
    G[i][j]=false;
  }
  int x,y;
  while(m--){
   cin>>x>>y;
   G[x][y]=G[y][x]=true;
  }
  BFS(n);
  bool ans=true;
  for(int i=1;i<=n;i++)
   if(!visit[i])
    ans=false;
  if(ans)
   printf("YES\n");
  else
   printf("NO\n");
 }
 return 0;
}

- DFS

你可能感兴趣的:(牛客网编程练习,ATT)