现在的位置: 首页 > 综合 > 正文

朋友圈转发信息

2017年10月17日 ⁄ 综合 ⁄ 共 3036字 ⁄ 字号 评论关闭

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

 

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

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

 

假设:对所有用户而言:

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

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

 

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

 

例如:

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

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


运行时间限制: 无限制
内存限制: 无限制
输入:

Sender

[消息创建者编号]

Relationship

[朋友关系列表,1,2 表示1和2是朋友关系]

End

 

如下:

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

输出:

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

#include <iostream>
#include <sstream>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;

void SetLevelNodeVecMap(map<int,vector<int> >& relation,map<int,vector<int> >& LevelNodeVecMap,int startId)
{
	map<int,int> NodeLevelMap;
	queue<int> NodeQue;
	map<int,vector<int> >::iterator it1;
	vector<int>::iterator it2;
	NodeLevelMap[startId] = 0;
	NodeQue.push(startId);
	while(!NodeQue.empty())
	{
		int nodeId = NodeQue.front();
		NodeQue.pop();
		it1 = relation.find(nodeId);
		for(it2 = it1->second.begin(); it2 != it1->second.end(); it2++)
		{
			if(NodeLevelMap.find(*it2) == NodeLevelMap.end())
			{
				NodeLevelMap[*it2] = NodeLevelMap[nodeId] + 1;
				NodeQue.push(*it2);
			}
		}
	}
	map<int,int>::iterator it;
	for(it = NodeLevelMap.begin(); it != NodeLevelMap.end(); it++)
	{
		LevelNodeVecMap[it->second].push_back(it->first);
	}
}

int GetEveryLevelTransmitCounts(map<int,vector<int> >& relation,vector<int> send,vector<int> recv)
{
	int nCount = 0;
	vector<int>::iterator it1,it2;
	map<int,int> TrasmitDegrees;   // 初始化时就是0
	map<int,int>::iterator itD;
	while(!recv.empty())
	{
		int transmitId = -1;
		TrasmitDegrees.clear();
		for(it1 = recv.begin(); it1 != recv.end(); it1++)
		{
			int AdjNum = 0;
			int lastAdj;
			vector<int> AdjVec = relation[*it1];
			for(it2 = AdjVec.begin(); it2 != AdjVec.end(); it2++)
			{
				if(find(send.begin(),send.end(),*it2) != send.end())
				{
					TrasmitDegrees[*it2]++;
					AdjNum++;
					lastAdj = *it2;
				}
			}
			if(AdjNum == 1)
			{
				transmitId = lastAdj;
				break;
			}
		}
		if(transmitId == -1)
		{
			int maxDegree = 0;
			for(itD = TrasmitDegrees.begin(); itD != TrasmitDegrees.end(); itD++)
			{
				if(itD->second > maxDegree)
				{
					maxDegree = itD->second;
					transmitId = itD->first;
				}
			}
		}
		nCount++;
		vector<int> AdjVecToDel = relation[transmitId];
		for(it1 = AdjVecToDel.begin(); it1 != AdjVecToDel.end(); it1++)
		{
			it2 = find(recv.begin(),recv.end(),*it1);
			if(it2 != recv.end())
				recv.erase(it2);
		}
		it1 = find(send.begin(),send.end(),transmitId);
		send.erase(it1);
	}
	return nCount;
}

int GetTotalTransmitCounts(map<int,vector<int> >& relation,map<int,vector<int> >& LevelNodeVecMap)
{
	int TotalCount = 0;
	int MaxLevel = LevelNodeVecMap.size() -1;
	for(int level = 1; level < MaxLevel; level++)
	{
		TotalCount = TotalCount +
			GetEveryLevelTransmitCounts(relation,LevelNodeVecMap[level],LevelNodeVecMap[level+1]);
	}
	return TotalCount;
}

int main(int agrc,char* agrv[])
{
	string sender,relation;
	int senderId,a,b;
	map<int,vector<int> > RelationMap;
	map<int,vector<int> > LevelNodeVecMap;
	cin>>sender>>senderId>>relation;
	while(cin>>relation)
	{
		if(relation == "End")
			break;
		else
		{
			istringstream in(relation);
			in>>a;
			in.ignore();
			in>>b;
			RelationMap[a].push_back(b);
			RelationMap[b].push_back(a);
		}
	}
	SetLevelNodeVecMap(RelationMap,LevelNodeVecMap,senderId);
	cout<<GetTotalTransmitCounts(RelationMap,LevelNodeVecMap)<<endl;
	return 0;
}

抱歉!评论已关闭.