백준: Gold4 - 1153, 1197(Kruskal)

1 분 소요


</br> 계속 계속
</br>

1153: 네 개의 소수

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

소수 4개 합으로 표현하기

    if( n % 2 ){
        for(int i = 0; i <= n-6; i++){
            if( primes[i] && primes[n-5-i] ){
                cout << "2 3 " << i << ' ' << n-5-i << endl;
                return 0;
            }
        }
    }
    else{
        for(int i = 0; i <= n-6; i++){
            if( primes[i] && primes[n-4-i] ){
                cout << "2 2 " << i << ' ' << n-4-i << endl;
                return 0;
            }
        }
    }

골드바흐의 추측을 사용한다고 한다 사실 찾아 봄…ㅋㅋ
4중 포문하니까 당연히 시간 초과 난다

2보다 큰 모든 짝수는 2개의 소수의 합으로 표현 가능하다.

따라서 n이 짝수면 2, 2를 빼고, 홀수면 2, 3을 빼서 새로운 짝수를 만들어 내고, 걔의 2개의 소수 합을 찾는다.
</br>

1197: 최소 스패닝 트리

https://www.acmcpc.net/problem/1197

최소 스패닝 트리의 가중치 구하기

    priority_queue<T, vector<T>, greater<T>> pq;
    for(int i = 0; i < e; i++){
        int a, b, c;
        cin >> a >> b >> c;
        pq.push(mt(c, a, b));
        parent[a] = a;
        parent[b] = b;
    }
    int ans = 0;
    while( pq.size() ){
        T t = pq.top();
        pq.pop();
        int ta = get<1>(t);
        int tb = get<2>(t);
        if( parent[ta] == parent[tb] ) continue;
        int p = min(parent[ta], parent[tb]);
        int pp = max(parent[ta], parent[tb]);
        for(int i = 1; i <= v; i++){
            if( parent[i] == pp ) parent[i] = p;
        }
        ans += get<0>(t);
    }
    cout << ans << endl;

크루스칼 알고리즘으로 풀어 보았다
일단 그래프에서 가중치가 적은 간선들 순으로 정렬한다.

ex)
i: 1 2 3 4 5
p: 1 2 3 4 5

(2, 4) 연결

i: 1 2 3 4 5
p: 1 2 3 2 5

(4, 5) 연결

i: 1 2 3 4 5
p: 1 2 3 2 2

(1, 2) 연결

i: 1 2 3 4 5
p: 1 1 3 2 2

i: 1 2 3 4 5
p: 1 1 3 1 1
2가 부모였던 애들도 부모를 1로 업데이트 해줌

대충 이런 식으로 부모를 업데이트 해주면, 같은 부모를 가지고 있는 간선끼리는 사이클이 생성 되므로 패스할 수 있다.
</br>


쭉 쭉
</br>

댓글남기기