在一個社交應用中,兩個用戶設定朋友關係後,則可以互相收到對方發佈或轉發的信息。當一個用戶發佈或轉發一條信息時,他的所有朋友都能收到該信息。
現給定一組用戶,及用戶之間的朋友關係。
問:當某用戶發佈一條信息之後,爲了讓每個人都能在最早時間收到這條信息,這條信息最少需要被轉發幾次?
假設:對所有用戶而言:
1)朋友發出信息到自己收到該信息的時延爲T(T>0);
2)如需轉發,從收到信息到轉發出信息的時延爲0。
用例保證:在給定的朋友圈關係中,任何人發佈的信息總是能通過N(N>=0)次轉發讓其他所有用戶收到。
例如:
下圖表示某個朋友圈關係(節點間連線表示朋友關係)中,用戶1在時刻0發佈信息之後,兩種不同的轉發策略。
***節點表示轉發用戶,藍色數字爲用戶收到信息的時間。
輸出: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; }