[BOJ 14172] Moocast

2023. 1. 20. 23:52Baekjoon

728x90

https://www.acmicpc.net/problem/14172

 

14172번: Moocast

Write a single line of output containing the maximum number of cows a broadcast from a single cow can reach. The originating cow is included in this number.

www.acmicpc.net

 

- 문제 요약

 

Farmer John의 N 소(1≤N≤200)는 그들 사이에서 중요한 메시지를 방송하기 위해 비상 "무캐스트" 시스템을 구성하려고 합니다.

소들은 먼 거리에서 서로 울부짖는 대신 소 한 마리당 하나씩 워키토키를 장착하기로 결정합니다. 이 워키토키는 각각 전송 반경이 제한되어 있습니다. 전력 P의 워키토키는 거리 P만큼 떨어진 다른 소에게만 전송할 수 있습니다(소 B가 할 수 없더라도 소 A는 소 B에게 전송할 수 있습니다. 암소 A의 전력이 암소 B의 전력보다 크기 때문에 다시 전송합니다. 다행히 소는 여러 홉으로 구성된 경로를 따라 서로 메시지를 전달할 수 있으므로 모든 소가 다른 모든 소에게 직접 전송할 수 있는 것은 아닙니다.

워키토키 전송의 비대칭 특성으로 인해 일부 젖소의 방송은 많은 수의 수신자에게 도달하는 능력(중계 고려)에서 다른 젖소보다 더 효과적일 수 있습니다. 암소가 한 마리의 암소에서 발생하는 브로드캐스트로 도달할 수 있는 최대 암소 수를 결정하도록 도와주세요.

 

 

- 알고리즘 정리

 

DFS 알고리즘을 활용하여 각각의 소가 다른 소에 연결되는 수를 저장하고, 방문 여부는 check[] 배열로 관리합니다.

만약 현재 다른 소에 연결된 수가 기존의 수보다 크다면 계속 갱신하며 최대값을 구합니다.

최대값은 ret 변수에 저장됩니다. (ret의 초기값은 1)

 

 

- 코드 작성

 

#include<bits/stdc++.h>
using namespace std;

struct st{
	int x,y,r;
};
int n;
vector<st>v;
bool check[201];

int f(int w){
	check[w]=true;
	int ret=1;
	int r2=v[w].r*v[w].r;
	for(int i=0;i<n;i++){
		int a=(v[w].x-v[i].x)*(v[w].x-v[i].x)+(v[w].y-v[i].y)*(v[w].y-v[i].y);
		if(!check[i]&&a<=r2){
			ret+=f(i);
		}
	}
	return ret;
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>n;
	for(int i=0;i<n;i++){
		int a,b,c;
		cin>>a>>b>>c;
		v.push_back({a,b,c});
	}
	int result=0;
	for(int i=0;i<n;i++){
		memset(check,0,sizeof(check));
		result=max(result,f(i));
	}
	cout<<result;
}

코드 제출 결과

 

728x90

'Baekjoon' 카테고리의 다른 글

[BOJ 15748] Rest Stops  (0) 2023.01.25
[BOJ 14452] Cow Dance Show  (0) 2023.01.23
[BOJ 5896] 효율적으로 소 사기  (0) 2023.01.17
[BOJ 17412] 도시 왕복하기 1  (0) 2023.01.12
[BOJ 3830] 교수님은 기다리지 않는다  (0) 2022.08.20