您的位置:首页 > 编程语言

360笔试编程题 找老乡(BFS解法)

2015-09-30 11:10 477 查看
题目:大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是多么激动的一件事,于是大家都热衷于问身边的同学是否与自己同乡。来自新疆的小鲵尤其热衷。但是大家都不告诉小尼他们来自哪里,只是说与谁同乡。从所给的信息中,你能告诉小尼有多少人确定是她的同乡么?

输入:每个测试实例首先包括两个整数,N(1 = < N < = 1000),M(0 = < M < = N*(N-1)/2),代表现在有N个人(用1~N编号)和M组关系;

在接下来的M行里,每行包括两个整数,a,b,代表a跟b是同乡;

当N=0,M=0输入结束;

已知1表示小尼本人。

输出: 对于每个测试实例,输出一个整数,代表确定是小尼同乡的人数。

方法:两种方法,图的遍历和并查集,本文为BFS解法。

代码:图的遍历

#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <deque>
#include <stdlib.h>
using namespace std;

int main(int argc, char *argv[])
{
int num, relation;
vector<int> result;
while (cin >> num >> relation)
{
if (num == 0 && relation == 0)
break;

int * table = (int *)malloc(num*num * 4);
memset(table, 0, num*num * 4);
int fir, sec;
for (int i = 0; i < relation; ++i)
{
cin >> fir >> sec;
table[(fir - 1)*num + sec - 1] = 1;
table[(sec - 1)*num + fir - 1] = 1;
}
deque<int> ideque;
set<int> iset;
for (int i = 0; i < num; ++i)
{
if (table[i] == 1)
{
ideque.push_back(i);
iset.insert(i);
}
}
if (ideque.size() == 0)
{
result.push_back(0);
continue;
}
bool* HasSearch = new bool[num];
memset(HasSearch, 0, num);
HasSearch[0] = true;

while (!ideque.empty())
{
int temp = ideque.front();
ideque.pop_front();
for (int i = 0; i < num; ++i)
{
if (table[temp*num + i] && !HasSearch[i])
{
ideque.push_back(i);
iset.insert(i);
}
}
HasSearch[temp] = true;
}
result.push_back(iset.size());
free(table);
free(HasSearch);
}
for (int i = 0; i < result.size(); ++i)
cout << result[i] << endl;
return 0;
}


测试结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: