일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- CircuitBreaker
- 우테코
- 자바
- AWS
- Level2
- 트랜잭션
- Spring Batch
- 우아한테크코스
- Docker
- 우아한세미나
- 프로그래머스
- JUnit5
- 백준
- 레벨2
- 서블릿
- 코드리뷰
- yml
- JPA
- AOP
- 미션
- 세션
- 프리코스
- HTTP
- mock
- REDIS
- 스프링 부트
- MSA
- 의존성
- 스프링부트
- Paging
Archives
- Today
- Total
늘
c/c++ 백준_19538 루머 본문
728x90
UCPC 2020 예선 G번 문제이다!
문제는 위와 같다. 생각보다 단순한 BFS를 돌리면 됐었다. 하지만 날짜를 증가시켜줄 때, 한꺼번에 넣어줘야하기 떄문에(따로따로 순서대로 날짜를 증가시키면 다음번에 루머확인할때 오류!) q에 한번 더 담아서 돌려줘야 한다는 것만 주의하면 됐었다.
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
vector<int> v[200000];
int rumor[200000] = { -1, };
int n;
int count_rumor(int x) {
int cnt = 0;
for (int i = 0; i < v[x].size(); ++i) {
if (rumor[v[x][i]] != -1) {
cnt++;
}
}
return cnt;
}
int main() {
queue<int> q;
queue<int> tq;
for (int i = 0; i < 200000; ++i)rumor[i] = -1;
cin >> n;
for (int i = 0; i < n; ++i) {
int x;
cin >> x;
while (x != 0) {
v[i].push_back(x-1);
cin >> x;
}
}
int diffusers;
cin >> diffusers;
for (int i = 0; i < diffusers; ++i) {
int k;
cin >> k;
rumor[k-1] = 0;
q.push(k-1);
}
int current = 0;
while (!q.empty()) { // 주변에 루머 개수 카운트 하고 자기 size랑 비교하기
int cx = q.front();
q.pop();
for (int i = 0; i < v[cx].size(); ++i) {
int nx = v[cx][i]; // 주변
if (rumor[nx] != -1)continue;
int rumors = count_rumor(nx); //cnt
if ((v[nx].size()+1) / 2 > rumors)continue;
tq.push(nx);
}
if (q.empty()) {
current++;
while (!tq.empty()) {
int ntx = tq.front();
tq.pop();
rumor[ntx] = current;
q.push(ntx);
}
}
}
for (int i = 0; i < n; ++i) {
cout << rumor[i] << " ";
}
}
728x90
Comments