在一个社交应用中,两个用户设定朋友关系后,则可以互相收到对方发布或转发的信息。当一个用户发布或转发一条信息时,他的所有朋友都能收到该信息。
现给定一组用户,及用户之间的朋友关系。
问:当某用户发布一条信息之后,为了让每个人都能在最早时间收到这条信息,这条信息最少需要被转发几次?
假设:对所有用户而言:
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;
}