朋友圈

在一個社交應用中,兩個用戶設定朋友關係後,則可以互相收到對方發佈或轉發的信息。當一個用戶發佈或轉發一條信息時,他的所有朋友都能收到該信息。

 

現給定一組用戶,及用戶之間的朋友關係。

問:當某用戶發佈一條信息之後,爲了讓每個人都能在最早時間收到這條信息,這條信息最少需要被轉發幾次?

 

假設:對所有用戶而言:

1)朋友發出信息到自己收到該信息的時延爲TT>0);

2)如需轉發,從收到信息到轉發出信息的時延爲0

 

用例保證:在給定的朋友圈關係中,任何人發佈的信息總是能通過NN>=0)次轉發讓其他所有用戶收到。

 

例如:

下圖表示某個朋友圈關係(節點間連線表示朋友關係)中,用戶1在時刻0發佈信息之後,兩種不同的轉發策略。

***節點表示轉發用戶,藍色數字爲用戶收到信息的時間

wKiom1Q-HMfCcbrxAADo7M-ILw4962.jpg\"

輸出:4

#include #include #include #include #include #include using namespace std;

void SetLevelNodeVecMap(map >& relation,map >& LevelNodeVecMap,int startId)
{
	map NodeLevelMap;
	queue NodeQue;
	map >::iterator it1;
	vector::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::iterator it;
	for(it = NodeLevelMap.begin(); it != NodeLevelMap.end(); it++)
	{
		LevelNodeVecMap[it->second].push_back(it->first);
	}
}

int GetEveryLevelTransmitCounts(map >& relation,vector send,vector recv)
{
	int nCount = 0;
	vector::iterator it1,it2;
	map TrasmitDegrees;   // ??????0
	map::iterator itD;
	while(!recv.empty())
	{
		int transmitId = -1;
		TrasmitDegrees.clear();
		for(it1 = recv.begin(); it1 != recv.end(); it1++)
		{
			int AdjNum = 0;
			int lastAdj;
			vector 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 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 >& relation,map >& 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 > RelationMap;
	map > 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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章