360笔试题--找老乡

思路:先对每组人员进行比较,保证较小的编号在a组中,然后根据a组进行排序。设定一个标志位数组,对应的每一位代表人物编号,值就是是否与1号人物是老乡。具体见代码。

#include<iostream>
using namespace std;
int main()
{
	int N,M;
	int count = 0;
	while(cin>>N>>M)
	{//循环输入
		if(0==N&&0==M)
			break;
		if(0==N||0==M)
		{
			cout<<count<<endl;
			continue;
		}
		int *a=new int[M];//人员a
		int *b=new int[M];//人员b
		bool *d=new bool[N+1];//标志位,下标对应人物编号,值为真时表示和一号人物是老乡

		for(int i=0;i<N+1;i++)
		{
			d[i]=false;//标志位初始化为假
		}

		int temp = 0;
		for (int i =0;i<M;i++)
		{
			cin>>a[i]>>b[i];
			if (a[i]>b[i])
			{//对应一组人员,保证人员编号小的在a组中,后面根据a组进行排序
				temp = a[i];
				a[i] = b[i];
				b[i] = temp;
			}

			int temp_a = a[i];
			int temp_b = b[i];
			int j;
			for (j=i-1;j>=0&&temp_a<a[j];j--)
			{//根据a组进行插入排序
				a[j+1]=a[j];
				b[j+1]=b[j];
			}
			a[j+1]=temp_a;
			b[j+1]=temp_b;

		}

		if (a[0]!=1)
		{//如果第0 位不是1号人物,那说名所有小组不会和1号人物有关系。
			cout<<count<<endl;
			continue;
		}
		else
		{
			d[a[0]]=true;
		}
		
		for(int i=0; i<M;i++)
		{//a[i]和b[i]是对应的,只要a[i]对应的标志位d[a[i]是真
         //则对应的d[b[i]]也是真。
         //因为a[i]编号小于b[i],所以对于整个循环来看,是先遍历到d[a[i]].
			if(d[a[i]])
				d[b[i]]=true;
		}
		
		for (int i=2;i<N+1;i++)
		{
			if(d[i])
				count++;
		}
		cout<<count<<endl;
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值