π λ§ν¬
https://www.acmicpc.net/problem/20666
π€― νμ€ νκΈ°
visit μ¬λν΄
π€· λ¬Έμ
π©π» νμ΄
visit νλ³λ¬Έ νμ€μ΄ λ νλ€κ² νλ λ¬Έμ
μμ shake! 2020 Bλ² λ¬Έμ μ΄λ€.
μ°μ μμ νλ₯Ό μ°λ©΄ νΈν λ¬Έμ !
μ²μμ item κ΄κ³λ₯Ό κ·Έλν μ²λΌ μκ°ν΄μ μ°κ²°νμ¬ νλ €κ³ νκΈ΄ νλλ° λμ΄λκ° λμμ§λ©΄ νμμ μ΄λ»κ² ν΄μΌν μ§ λͺ¨λ₯΄κ² μ΄μ μ²μλΆν° λ€μ μκ°νλ€. κ·Έλ¬λ μ€ μμ μ²μλΆν° λμ΄λλ₯Ό μ¬λ €μ μμνλκ² μ’μ κ² κ°λ€λ μκ°μ΄ λ€μλ€.
μ²μμλ 무쑰건 item μμ΄ μμν ν λ tipμΌλ‘ λ€μ΄μ¨ λͺ¬μ€ν°λ λμ΄λλ₯Ό 미리 μ¬λ €μ νμ λ£μ΄μ£Όμλ€.
νλ { λμ΄λ, μΈλ±μ€ } νμμΌλ‘ λ€μ΄κ°κ³ , λμ΄λλ₯Ό κΈ°μ€μΌλ‘ min heapμ λ§λ€μ΄μ€¬λ€.
μ΄μ λμ΄λκ° μμ λͺ¬μ€ν°λΆν° topμμ λμ¬ν λ° ν΄λΉ λͺ¬μ€ν°λ₯Ό μ‘κ³ λ°λ‘ μ΄ λͺ¬μ€ν°λ₯Ό μ‘μΌλ©΄ λμ΄λ κ°μ ν¨κ³Όλ₯Ό λ릴 μ μλ λͺ¬μ€ν°λ€μ λͺ¨λ μ°Ύμμ νν₯μμΌμ€λ€.
νν₯ μν€κ³ λμ λ€μ νμ λ£μ΄μ€λ€. μ΄μ°¨νΌ μμ μλ κ°μ λͺ¬μ€ν°λ₯Ό κ°±μ μν€μ§ μμλ λλ μ΄μ λ min heap μ΄κ³ , λμ΄λκ° λ΄λ €κ°κΈ° λλ¬Έμ κ°±μ ν νμ μμ΄ νμ λ€μ΄κ° λͺ¬μ€ν°κ° λ topμ κ°κΉμΈ κ²μ΄λ€.
μ΄ κ³Όμ μμ visit λ°°μ΄μ μν μ΄ μ€μνλ€.
μ²μμ queueμμ λμ€λ λͺ¬μ€ν°λ§ visit νλ³μ ν΄μ€¬λλ κ³μν΄μ TLEκ° λ°μνλ€.
κ³°κ³°ν μκ°ν΄λ³΄λ μ΄λ―Έ μ£½μ λͺ¬μ€ν°λ λμ€μ μ΄λ€ μμ΄ν μ΄ μκ²Όλ€κ³ ν΄μ λμ΄λλ₯Ό νν₯μμΌμ€ νμκ° μλ€.
μ΄κ² key point κ°λ€. λ°λΌμ for λ¬Έμμ μ΄λ―Έ μ£½μ λͺ¬μ€ν°λ λμ΄λ μ°μ° μμ΄ continue νλλ‘ μμ νμλλ ACλ₯Ό λ°μ μ μμλ€.
μ£Όμν μ μ λ± λ³΄λ€ μΆμ΄ λμ΄λκ° κ΅μ₯ν ν° μ«μλ‘ λ€μ΄μ¨λ€.
+, - μ°μ°μ΄ μμΌλ μλ£νμ long longμΌλ‘ ν΄μ£Όμ.
π» μ½λ
//TLE
//BOJ 20666 μΈλ¬Όμ΄μ μ μ
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <string>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
priority_queue<pii, vector<pii>, greater<pii>> q;
ll add[101010];
int visit[101010];
vector<pii> item[101010];
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int N, M;
ll maxC = 0;
cin >> N >> M;
for(int i=1; i<=N; i++) {
cin >> add[i];
}
int p;
cin >> p;
for(int i=0; i<p; i++) {
int a, b, c;
cin >> a >> b >> c;
add[b] += c;
item[a].push_back({b, c});
}
for(int i=1; i<=N; i++) {
q.push({add[i], i});
}
int cnt = 0;
while(cnt < M) {
pii monster = q.top();
q.pop();
if(visit[monster.second]) continue;
visit[monster.second] = 1;
for (pii temp : item[monster.second]) {
if(visit[temp.first]) continue;
add[temp.first] -= temp.second;
q.push({add[temp.first], temp.first});
}
if(maxC < monster.first) maxC = monster.first;
cnt += 1;
}
cout << maxC;
return 0;
}
'DEV > PS' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[BOJ/14746] Closest Pair, c++ (0) | 2021.09.20 |
---|---|
[BOJ/20218] Parity Constraint Shortest Path, c++ (1) | 2021.08.28 |
[BOJ/20665] λ μμ€ κ±°λ¦¬λκΈ°, c++ (2) | 2021.08.20 |
[BOJ/11280] 2-SAT - 3, c++ (2) | 2021.08.19 |
[BOJ/17222] μμ€ν€ κ±°λ, c++ (2) | 2021.08.12 |