개발자 톡

연습문제 톡 [21년 재직자 대회 예선] 로드 밸런서 트래픽 예측

로드 밸런서 트래픽 예측 C++ 반례부탁드립니다.

등록일
2024-01-20 19:02:32
조회수
286
작성자
hys339631

#include <iostream>

#include <vector>

#include <queue>

#define MAX_SIZE 100004


using namespace std;


struct Node{

  long long tN;

  vector<long long> v;

};


long long N,K;

Node LB[MAX_SIZE];

long long ret[MAX_SIZE];

long long in_degree[MAX_SIZE];

queue<long long> q;


void display_() {

  for(long long i=1;i<=N;i++) {

    cout << ret[i] << " ";

  }

  cout << '\n';

}


void check_(long long idx) {

   

  bool check_Flag=false;

  if(LB[idx].tN<ret[idx]) {

    check_Flag=true;

  }

   

  for(long long i=0;i<LB[idx].tN;i++) {

    if(check_Flag) {

      in_degree[LB[idx].v[i]]-=1;

      if(in_degree[LB[idx].v[i]]==0) {

        q.push(LB[idx].v[i]);

      }

    }

    ret[LB[idx].v[i]]+=ret[idx]/LB[idx].tN;

  }

  for(long long i=0;i<ret[idx]%LB[idx].tN;i++) {

    if(!check_Flag) {

      in_degree[LB[idx].v[i]]-=1;

      if(in_degree[LB[idx].v[i]]==0) {

        q.push(LB[idx].v[i]);

      }

    }

    ret[LB[idx].v[i]]+=1;

  }

}


void go_() {

   

  ret[1]=K;

  q.push(1);

   

  while(!q.empty()) {

    long long temp=q.front();

    q.pop();

    if(LB[temp].tN!=0) {

      check_(temp);

    }

  }

}


int main() {

  ios_base::sync_with_stdio(false);

  cin.tie(nullptr);

  cout.tie(nullptr);

   

  cin >> N >> K;

  for(long long i=1;i<=N;i++) {

    long long tempN;

    cin >> tempN;

    LB[i].tN=tempN;

     

    for(long long j=0;j<tempN;j++) {

      long long data;

      cin >> data;

      LB[i].v.push_back(data);

      in_degree[data]+=1;

    }

  }

   

  go_();

  display_();

   

  return 0;

}


위상정렬을 사용해서 in_degree 가 0 인 node 의 자식들에게 값을 분배하는 식으로 알고리즘을 작성했는데 반례가 도저히 생각나지 않습니다,..

#[21년_재직자_대회_예선]_로드_밸런서_트래픽_예측
#c++

이 카테고리의 톡 더보기