Codeup墓地 问题 B: 连通图 (BFS写法)

题目描述

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

输入

每组数据的第一行是两个整数 n 和 m(0<=n<=1000)。n 表示图的顶点数目,m 表示图中边的数目。如果 n 为 0 表示输入结束。随后有 m 行数据,每行有两个值 x 和 y(0<x, y <=n),表示顶点 x 和 y 相连,顶点的编号从 1 开始计算。输入不保证这些边是否重复。

输出

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

样例输入

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

样例输出

YES
YES
NO
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
const int maxn = 1000+10;
using namespace std;

vector<int>map[maxn];
bool vis[maxn] = {false};


void bfs(int u)
{
	queue<int>q;
	q.push(u);
	vis[u] = true;
	while (!q.empty())
	{
		int v;
		int top = q.front();
		q.pop();
		for (int i=0;i<map[top].size();i++)
		{
			 v = map[top][i];
			if (vis[v] == false )
			{
				vis[v] = true;
				q.push(v);
			}
		}
		 
	}
}




int main()
{
	int n,m,j,k,i,T,a,b;
	while (cin>>n>>m)
	{
		for(i=1;i<=n;i++)
		map[i].clear(); //每次要清空vector容器 
		memset(vis,false,sizeof(vis)); 
		if (n==0) break;
		
		while (m--)
		{
			cin>>a>>b;
			map[a].push_back(b);
			map[b].push_back(a);
		}
	int ans=0;
	for (int i=1;i<=n;i++)
	{
		if (vis[i]==false)
		{
			bfs(i);
			ans++;
		}
	}
		if (ans==1)
		cout<<"YES"<<endl;
		else
		cout<<"NO"<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40763929/article/details/82462944
今日推荐