ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20230808 업다운 랜디
    Study/PS 2023. 8. 9. 02:46

    s#100.. !solved_by:p_jun *P5

    30분 2문제

     

    오늘은 놀아버려서 2문제만 풀었다

     

    P5 5551 쇼핑몰 + 2분 6초

    문제를 보자마자 다익스트라로 최솟값에서 어떻게 잘하면 될거 같은데...

    라는 생각이 들었다

    고민하다 거리를 반으로 나누어 두는 방식으로 구현해서 맞았다

    그런데 처음 맞은 풀이는 인덱싱 실수를 해서 틀려야 하는데...

    데이터가 약한가보다

    더보기
    #include <iostream>
    #include <iomanip>
    #include <algorithm>
    #include <vector>
    #include <string>
    #include <cstring>
    #include <stack>
    #include <queue>
    #include <deque>
    #include<set>
    #include<map>
    #include<cassert>
    using namespace std;
    using ll = long long;
    #define MOD 1000000007
    const ll INF = 987654321;
    const int MX = 500005;
    
    vector<pair<int, int>> r[3005];
    
    int d[3005];
    
    int main() {
        ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
        int n, m, k; cin >> n >> m >> k;
        for (int i = 0; i < m; i++) {
            int s, e, w; cin >> s >> e >> w;
            r[s].push_back({ e,w });
            r[e].push_back({ s,w });
        }
        for (int i = 0; i < n; i++) d[i + 1] = INF;
        priority_queue<pair<int, int>> pq;
        for (int i = 0; i < k; i++) {
            int p; cin >> p;
            d[p] = 0;
            pq.push({ 0,p });
        }
        int ans = 0;
        while (!pq.empty()) {
            int now = pq.top().second;
            int dist = -pq.top().first;
            pq.pop();
            if (d[now] < dist) continue;
            for (auto& [nxt, l] : r[now]) {
                int ndis = dist + l;
                if (ndis < d[nxt]) {
                    d[nxt] = ndis;
                    pq.push({ -ndis,nxt });
                }
            }
        }
        for (int i = 1; i < n + 1; i++)
            for (auto& [nxt, l] : r[i])
                ans = max(ans, (d[i] + d[nxt] + l + 1) / 2);
        cout << ans << '\n';
    
    }

    P4 14433 한조 대기 중 -20분 12초

    이분 매칭이란건 바로 알 수 있었다

    이분 매칭은 기억이 잘 안나서 찾아 봤다

    해결 아이디어는 내가 냈으니 맞은 걸로 ㅎㅎ

    더보기
    #include <iostream>
    #include <iomanip>
    #include <algorithm>
    #include <vector>
    #include <string>
    #include <cstring>
    #include <stack>
    #include <queue>
    #include <deque>
    #include<set>
    #include<map>
    #include<cassert>
    using namespace std;
    using ll = long long;
    #define MOD 1000000007
    const ll INF = 987654321;
    const int MX = 500005;
    
    vector<int> r[605];
    int chk[605], isv[605];
    
    int dfs(int pos) {
        if(isv[pos]) return 0;
        isv[pos] = 1;
        for(int& x: r[pos])
            if (!chk[x] || dfs(chk[x])) {
                chk[x] = pos;
                return 1;
            }
        return 0;
    }
    
    int main() {
        ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
        int n, k; cin >> n >> k;
        int k1, k2; cin >> k1 >> k2;
        while (k1--) {
            int i, j; cin >> i >> j;
            r[i].push_back(j);
        }
        while (k2--) {
            int i, j; cin >> i >> j;
            r[i + 300].push_back(j + 300);
        }
        int w = 0, l = 0;
        for (int i = 1; i < n + 1; i++) {
            memset(isv, 0, sizeof(isv));
            if (dfs(i)) w++;
            if (dfs(i + 300)) l++;
        }
        cout << (w < l ? "네 다음 힐딱이" : "그만 알아보자") << '\n';
    }

     

    'Study > PS' 카테고리의 다른 글

    20230811 업다운 랜디  (2) 2023.08.11
    20230807 업다운 랜디  (2) 2023.08.07
    20230806 업다운 랜디  (0) 2023.08.06
    20230805 업다운 랜디  (0) 2023.08.05

    댓글

Designed by Tistory.