2015华为上机练习《朋友圈转发消息》

在一个社交应用中,两个用户设定朋友关系后,则可以互相收到对方发布或转发的信息。当一个用户发布或转发一条信息时,他的所有朋友都能收到该信息。

 

现给定一组用户,及用户之间的朋友关系。

问:当某用户发布一条信息之后,为了让每个人都能在最早时间收到这条信息,这条信息最少需要被转发几次?

 

假设:对所有用户而言:

1)朋友发出信息到自己收到该信息的时延为T(T>0);

2)如需转发,从收到信息到转发出信息的时延为0。

 

用例保证:在给定的朋友圈关系中,任何人发布的信息总是能通过N(N>=0)次转发让其他所有用户收到。

 

例如:

下图表示某个朋友圈关系(节点间连线表示朋友关系)中,用户1在时刻0发布信息之后,两种不同的转发策略。

黄色节点表示转发用户,蓝色数字为用户收到信息的时间


输入样例:

Sender

1

Relationship

1,2

1,3

1,4

2,5

2,6

3,6

4,6

4,7

5,6

5,8

5,9

6,7

6,8

6,9

7,9

10,7

End

输出:4


程序:

</pre><pre name="code" class="cpp">#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
using namespace std;


typedef struct user 
{
int userId;
int *friends;
int n;
}user;
void main()
{
string str;
cin>>str;//Sender
int id;
cin>>id;


cin>>str;//Relationship
cin>>str;
string dst;
vector<int> vec;
while (str!="End")
{
int idt=str.find(',');
dst=str.substr(0,idt);
int idx=atoi(dst.c_str());
vec.push_back(idx);
dst=str.substr(idt+1,str.length()-idt);
idx=atoi(dst.c_str());
vec.push_back(idx);
cin>>str;
}
int sz=(int)vec.size();
vector<int> userIds;
userIds.push_back(vec[0]);
userIds.push_back(vec[1]);
vector<vector<int> > friends;
friends.resize(2,vector<int>(0));
friends[0].push_back(vec[1]);
friends[1].push_back(vec[0]);
int i,j;
for (i=2;i<sz;i++)
{
vector<int>::iterator result=find(userIds.begin(),userIds.end(),vec[i]);
if (result==userIds.end())
{
userIds.push_back(vec[i]);
friends.resize(userIds.size(),vector<int>(0));
if (i%2==0)
{
friends[userIds.size()-1].push_back(vec[i+1]);
}
else
{
friends[userIds.size()-1].push_back(vec[i-1]);
}

}
else
{


//int dis=((int)result-(int)userIds.begin())/sizeof(vector<int>::iterator);
int dis=result-userIds.begin();
if (i%2==0)
{
friends[dis].push_back(vec[i+1]);
}
else
{
friends[dis].push_back(vec[i-1]);
}
}


}
int user_sz=(int)userIds.size();
user* users=new user[user_sz];
for (i=0;i<user_sz;i++)
{
users[i].userId=userIds[i];
int friends_sz=friends[i].size();
users[i].n=friends_sz;
users[i].friends=new int[friends_sz];
for (int j=0;j<friends_sz;j++)
{
users[i].friends[j]=friends[i][j];
}
}
//shu chu
// cout<<endl;
// for (i=0;i<user_sz;i++)
// {
// cout<<"userId:"<<users[i].userId<<endl;
// for (j=0;j<users[i].n;j++)
// {
// cout<<"friends:"<<users[i].friends[j]<<" ";
// }
// cout<<endl<<endl;
// }
vector<int>::iterator idFinder=find(userIds.begin(),userIds.end(),id);
int idx=idFinder-userIds.begin();
int min_time=1;//the min receiver time
int num=users[idx].n+1;
vector<int> sender,receiver;
vector<vector<int> > receivers;
receiver.push_back(id);
receivers.push_back(receiver);//time:0
receiver.clear();
sender.push_back(users[idx].userId);
for (i=0;i<users[idx].n;i++)
{
receiver.push_back(users[idx].friends[i]);
}
receivers.push_back(receiver);//time:T
vector<int> newReceiver;
while(num!=user_sz)
{
min_time++;
newReceiver.clear();
sender.insert(sender.end(),receiver.begin(),receiver.end());//add receiver to sender
for (i=0;i<receiver.size();i++)
{
idFinder=find(userIds.begin(),userIds.end(),receiver[i]);
idx=idFinder-userIds.begin();
for (j=0;j<users[idx].n;j++)
{
idFinder=find(sender.begin(),sender.end(),users[idx].friends[j]);
if (idFinder!=sender.end())//如果已经存在
{
continue;
}
idFinder=find(newReceiver.begin(),newReceiver.end(),users[idx].friends[j]);
if (idFinder==newReceiver.end())
{
newReceiver.push_back(users[idx].friends[j]);
}
}

}
receivers.push_back(newReceiver);//time:nT
receiver.assign(newReceiver.begin(),newReceiver.end());
num=sender.size()+receiver.size();
}
// cout<<"Sender:";
// for (i=0;i<sender.size();i++)
// {
// cout<<sender[i]<<",";
// }
// cout<<endl;
// for (i=0;i<receivers.size();i++)
// {
// cout<<"Receiver:"<<i<<"T"<<endl;
// for (j=0;j<receivers[i].size();j++)
// {
// cout<<receivers[i][j]<<",";
// }
// cout<<endl;
// 
// }
// cout<<endl;
//above code guarantee the minimum time!
int receivers_sz=receivers.size();
int relay=sender.size()-1;
int k,m;
for (i=receivers_sz-2;i>=0;i--)
{
//cout<<"level:"<<i<<endl;
receiver.assign(receivers[i].begin(),receivers[i].end());
GOTO_1: 
int s=receiver.size();
for (m=0;m<s;m++)//except the m-th one
{ 
newReceiver.clear();
for (j=0;j<s;j++)
{
if (j==m)//only except the m-th one
{
continue;
}
idFinder=find(userIds.begin(),userIds.end(),receiver[j]);
idx=idFinder-userIds.begin();
for (k=0;k<users[idx].n;k++)
{
idFinder=find(receivers[i+1].begin(),receivers[i+1].end(),users[idx].friends[k]);
if (idFinder==receivers[i+1].end())//not in receivers[i+1]
{
continue;
}
idFinder=find(newReceiver.begin(),newReceiver.end(),users[idx].friends[k]);
if (idFinder==newReceiver.end())
{
newReceiver.push_back(users[idx].friends[k]);
//cout<<users[idx].friends[k]<<",";
} 
}
//cout<<endl;
}
//compare
if (newReceiver.size()==receivers[i+1].size())
{
receiver.erase(receiver.begin()+m);
relay--;
goto GOTO_1;
}
}

}
cout<<relay;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值