• 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;
    }
  • 相关阅读:
    sqlserver编程基本语法
    每日一记--技术小细节
    每日一记--jsp
    每日一记--session/servletContext
    每日一记--cookie
    每日一记--HashTable/HashMap/ConcurrentHashMap
    每日一记--Ajax(下)
    每日一记--Axjx
    每日一记--索引/过滤器
    每日一记--酱油日
  • 原文地址:https://www.cnblogs.com/Romantic-Chopin/p/12451446.html
Copyright © 2020-2023  润新知