当前位置 博文首页 > u012938183的博客:公司数量【ybt书上】

    u012938183的博客:公司数量【ybt书上】

    作者:[db:作者] 时间:2021-06-13 12:15

    公司数量[ybt书上]

    【问题描述】
    在某个城市里住着n个人, 现在给定关于 n个人的m条信息
    (即某2个人认识) , 假设所有认识(直接或间接认识都算认
    识) 的人一定属于同一个公司。
    若是某两人不在给出的信息里, 那么他们不认识, 属于两
    个不同的公司。
    已知人的编号从1至n。
    请计算该城市最多有多少公司。
    【输入】
    第一行: n(<=10000,人数) ,
    第二行: m(<=100000, 信息)
    以下若干行: 每行两个数: i 和j, 中间一个空格隔开, 表
    示i和j相互认识。
    【输出】
    公司的数量。

    方法1:dfs

    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    bool vis[10010];
    int mp[10010][10010];
    
    int n, m;
    
    void dfs(int x)
    {
    	vis[x] = true;
    	for(int i = 1; i <= n; i ++)
    	{
    		if(mp[x][i])
    		{
    			if(! vis[i])
    			{
    				dfs(i);
    			}
    		}
    	}
    }
    
    int main()
    {
    	scanf("%d%d", &n, &m);
    	for(int i = 1; i <= m; i ++)
    	{
    		int x, y;
    		scanf("%d%d", &x, &y);
    		mp[x][y] = mp[y][x] = true;
    	}
    	int cnt = 0;
    	for(int i = 1; i <= n; i ++)
    	{
    		if(! vis[i])
    		{
    			cnt ++;
    			dfs(i);
    		}
    	}
    	printf("%d\n", cnt);
    	return 0;
    }
    

    方法2:bfs

    #include <iostream>
    #include <cstdio>
    #include <queue>
    using namespace std;
    
    int n, m;
    
    int mp[10010][10010];
    int vis[10010];
    
    void bfs(int v)
    {
    	queue<int> q;
    	q.push(v);
    	vis[v] = true;
    	while(! q.empty())
    	{
    		int f = q.front();
    		q.pop();
    		for(int i = 1; i <= n; i ++)
    		{
    			if(mp[f][i] && ! vis[i])
    			{
    				q.push(i);
    				vis[i] = true;
    			}
    		}
    	}
    }
    
    int main()
    {
    	scanf("%d%d", &n, &m);
    	for(int i = 1; i <= m; i ++)
    	{
    		int x, y;
    		scanf("%d%d", &x, &y);
    		mp[x][y] = mp[y][x] = true;
    	}
    	int cnt = 0;
    	for(int i = 1; i <= n; i ++)
    	{
    		if(! vis[i])
    		{
    			bfs(i);
    			cnt ++;
    		}
    	}
    	printf("%d\n", cnt);
    	return 0;
    }
    
    

    方法3:并查集(不在今天学习的范围内,有兴趣的同学自己研究)

    下一篇:没有了