티스토리 뷰

반응형

✏️ 문제 링크

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

 

25168번: 게으른 아리를 위한 접종 계획

첫째 줄에 백신의 개수 N (1 < N ≤ 10,000)와 백신들의 선행관계 개수 M (1 ≤ M < 100,000)가 주어진다. 둘째 줄부터 M+1번째 줄까지 총 M개의 줄에 각 선행관계의 정보가 세 개의 정수 S,E (1 ≤ S < E ≤ N),

www.acmicpc.net

✏️ 문제 풀이

 위상정렬을 이용해서 풀었고 백신의 유효기간에 주의하여서 문제를 접근하였습니다.

 이 부분에서 경우의 수가 나눠지게 됩니다. 두 백신간의 최소 대기기간이 일주일 이상 넘어가게 되는 경우와 그렇지 않은

  경우로 나누어서 풀어야 합니다. 이것만 주의한다면 일반적인 위상정렬 문제와 다를게 없습니다.

 일주일 이상 넘어가게 되는 경우 : ans[next] = max(ans[next], ans[node] + time+1);

 일주일 이내인 경우 : ans[next] = max(ans[next], ans[node] + time);

 max(ans)값을 출력하면 됩니다

 

✏️ 문제 코드

#include<iostream>
#include<queue>
#include<vector>
#include<limits.h>
using namespace std;

typedef pair<int, int>cur;
vector<vector<cur>>mlist;
vector<int>ans;
vector<int>indegree;
int main() {

	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, M;
	cin >> N >> M;
	mlist.resize(N + 1);
	indegree.resize(N + 1);
	ans.resize(N + 1);


	for (int i = 0; i < M; i++) {
		int start, end, time;
		cin >> start >> end >> time;
		mlist[start].push_back(make_pair(end, time));
		indegree[end]++;
	}

	queue<int>q;
	for (int i = 1; i <= N; i++) {
		if (indegree[i] == 0) {
			q.push(i);
			ans[i] = 1;
		}
	}

	while (!q.empty()) {
		int node = q.front();
		q.pop();
		for (cur temp : mlist[node]) {
			int next = temp.first;
			int time = temp.second;
			indegree[next]--;
			if(time>=7)
				ans[next] = max(ans[next], ans[node] + time+1);
			else
				ans[next] = max(ans[next], ans[node] + time);
			if (indegree[next] == 0)
				q.push(next);
		
		}
	}
	int max = INT_MIN;
	for (int i = 1; i <= N; i++) {
		if (max < ans[i])
			max = ans[i];
	}
	
	cout << max;
}
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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 29 30 31
글 보관함