[BFS]백준 19538번 루머

업데이트:

백준 19538번

루머

처음 풀어보는 BFS 문제라 아예 감이 안왔다. 무엇인지는 알고 있는데 구현이 어떤지는 전혀 몰라서.. 찾아보니 Queue를 이용하는 문제였다.

_2021-01-12__1 48 36

다만 입력 부분이 조금 복잡해 구조체를 사용했는데, 이런 단순 구현 대신 알고리즘이나 자료구조를 더 활용하는 법을 익히는 게 중요할 것 같다.

우선 실험 참여자들은 하나의 구조체로 정의되는데, 구조체는

  • 주변인 정보가 담긴 벡터
  • 믿기 시작한 시간
  • 믿음 여부
  • 주변인들 중 믿는 주변인 수

의 멤버를 가진다.

입력을 모두 처리 및 초기화 한 뒤에, 최초 유포자를 큐에 집어넣는다. 이 때 최초 유포자는 시간을 0, 믿음을 true로 설정한 뒤 집어넣는다.

그리고 시간은 1부터 시작한다.

만약 큐의 front 가 믿음을 가진 경우라면

front의 주변인들을 순회하며 각 주변인들의 {주변인들 중 믿는 주변인 수} 멤버를 증가시킨다.

증가시킨 후 해당 주변인이 믿음을 가지는 조건을 만족하는지를 확인한다.

만약 믿음을 가지는 조건을 만족하는 경우

상태 정보를 업데이트 한다.

이 때, 시간 정보는 자신에게 믿음을 전파한 실험 참가자의 시간 + 1 로 정한다.

queue 에 집어넣는다.

만약 큐의 front가 믿음을 가지지 않는다면

넘어간다.

시간 정보를 업데이트 하는 부분에서 생각이 잘 안나 하루를 소비했다.

무조건 자신에게 현재 루머를 전파해준 참가자보다 1 늦은 시간에 소문을 듣게 되는 것인데,, 왜 그렇게 생각을 못했는지 모르겠다.

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

struct human{
    vector<int> adj;
    int adj_belief;
    int time;
    bool belief;
};

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL),cout.tie(NULL);
    //how many people?
    int population;
    cin >> population;
    //operating queue
    queue<struct human> q;
    //total human group
   vector<struct human> group;
   //initialize human
   for(int i=0;i<population;i++){
       struct human tmp;
       tmp.belief = false;
       tmp.time = -1;
       tmp.adj_belief = 0;
       //put human into the group
       int temp=-1;
       while(temp != 0 && cin >> temp){
           //update adjacent info
           if(temp != 0) {
               tmp.adj.push_back(temp);
            }
        } 
        group.push_back(tmp);
   }
   //how many spreaders in the group
   int spreader_num;
  cin >> spreader_num;
  vector<int> spreader; 
  for(int i=0;i<spreader_num;i++){
      int temp;
      cin >> temp;
      //put spreaders into the group (root)
      //spreaders believe themselves.
      group[temp-1].time = 0;
      group[temp-1].belief = true;
      q.push(group[temp-1]);
  } 
  //set time to 1
  int t=1;
 while(!q.empty()){
      struct human speaker = q.front();
      q.pop();
      if(speaker.belief){
          for(int i=0;i<speaker.adj.size();i++){
              struct human *subject = &group[speaker.adj[i]-1]; 
              subject->adj_belief++;
              if(subject->belief==false && subject->adj_belief * 2 >= (float)subject->adj.size()){
                  subject->belief=true;
                  subject->time = speaker.time+1;
                  q.push(*subject);
              }
          }
          
        } 
     if(q.front().time != speaker.time){
         t++;
     }
    }
  for(int i=0;i<group.size();i++){
      cout << group[i].time << " ";
  }
}

카테고리:

업데이트:

댓글남기기