문제

https://codeforces.com/problemset/problem/1475/C

걸린 시간

- 실패

풀이

C++

#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0)
#define all(c) c.begin(), c.end()
#define INF 1e9
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

int main(){
    fastio;
    int tc;
    cin >> tc;
    while(tc--){
        int a, b, k;
        cin >> a >> b >> k;
        vector<pair<int, int>> C(k);
        for(int i = 0; i < k; i++){
            cin >> C[i].first;
        }
        for(int i = 0; i < k; i++){
            cin >> C[i].second;
        }
        vector<int> A(a+1), B(b+1);
        for(int i = 0; i < k; i++){
            A[C[i].first]++;
            B[C[i].second]++;
        }
        ll ans = 0;
        for(int i = 0; i < k; i++){
            ans += k - A[C[i].first] - B[C[i].second] + 1;
        }
        cout << ans/2 << "\n";
    }
    return 0;
}

그래프의 모든 정점이 두 그룹으로 나눠지고 서로 다른 그룹의 정점이 서로 연결된 그래프 형태를 이분 그래프라고 한다.

무도회에 참여할 준비가 된 남녀 쌍의 정보를 이분 그래프에 나타내었을 때, 가능한 서로 다른 두 쌍의 개수를 구하는 문제이다.

선택한 쌍을 제외한 다른 쌍을 찾으려면 연결정보를 모두 확인해야하는 방법밖에 없는 줄 알았지만, 모든 간선의 개수는 k 개 임을 이용하여 시간안에 해결이 가능했다.

선택한 쌍이 (a, b) 라면 a, b 와 연결된 모든 간선의 개수를 k 에서 뺀 후 a, b 사이의 간선의 개수를 하나 더해주면, 선택한 (a, b) 와 같이 출전 가능한 쌍의 개수를 찾을 수 있다.

모든 간선에 대하여 똑같은 작업을 반복, 누적하면 가능한 경우의 수가 두번씩 중복된 값을 가진다. 2로 나누어 출력하면 정답이다.

'Codeforces' 카테고리의 다른 글

Codeforces #1497B M-arrays  (0) 2021.04.01
Codeforces #1473C No More Inversions  (0) 2021.03.31
Codeforces #1484B Restore Modulo  (0) 2021.03.30
Codeforces Round #711 (Div. 2) A, B  (0) 2021.03.30
Codeforces #1496B Max and Mex  (0) 2021.03.29

댓글