zoukankan      html  css  js  c++  java
  • 小米2013年校园招聘笔试题——朋友圈

    题目描述:

    假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。
    假如:n = 5 , m = 3 , r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1、2、3属于一个朋友圈,4、5属于另一个朋友圈,结果为2个朋友圈。

    输入:

    输入包含多个测试用例,每个测试用例的第一行包含两个正整数 n、m,1=<n,m<=100000。接下来有m行,每行分别输入两个人的编号f,t(1=<f,t<=n),表示f和t是好友。 当n为0时,输入结束,该用例不被处理。

    输出:

    对应每个测试用例,输出在这n个人里一共有多少个朋友圈。

    样例输入:
    5 3
    1 2
    2 3
    4 5
    3 3
    1 2
    1 3
    2 3
    0
    样例输出:
    2
    1
    
    来源:
    小米2013年校园招聘笔试题

    这是一道基础的并查集问题。要注意的是数组要开大点,否则跟我一样Runtime Error就悲剧了。

    #include <iostream>
    using namespace std;
    const int MAX=300000;
    int n,m,k;
    int parent[MAX+10];
    int bit[MAX+10];
    int GetParent(int a)
    {
    	if(parent[a]!=a)
    		parent[a]=GetParent(parent[a]);
    	return parent[a];
    }
    void Merge(int a,int b)
    {
    	int p1=GetParent(a);
    	int p2=GetParent(b);
    	if(p1==p2)
    		return;
    	bit[p2]=0;
    	parent[p2]=p1;
    }
    int main()
    {
    	int i;
    	while(1)
    	{
    		int f,t;
    		cin>>n;
    		if(n==0)
    			break;
    		cin>>m;
    		bit[0]=0;
    		for(i=1;i<=n;i++)
    			{
    				parent[i]=i;
    				bit[i]=1;
    	    	}
    		for(i=0;i<m;i++)
    		{
    			cin>>f>>t;
    			Merge(f,t);
    		}
    		int sum=0;
    		for(i=1;i<=n;i++)
    		{
    			if(bit[i])
    				sum++;
    		}
    		cout<<sum<<endl;
    	}
    	return 0;
    }


     

  • 相关阅读:
    iOS常用的终端指令
    instancesRespondToSelector与respondsToSelector的区别
    Struts2(一)快速入门
    pl/sql快速输入select * from等语句快捷键设置
    win10系统安装oracle11g时遇到INS-13001环境不满足最低要求
    JSP四大作用域
    J2EE开发模式
    JAVA四大域对象总结
    Apache与Tomcat有什么关系和区别
    Junit测试框架
  • 原文地址:https://www.cnblogs.com/unclejelly/p/4082155.html
Copyright © 2011-2022 走看看