解题思路

这是一道二分图匹配相关的问题,主要思路如下:

  1. 数据结构:

    • 使用邻接矩阵 Map[1001][1001] 存储配对关系
    • 使用 vector 记录每个人需要配对的次数
  2. 处理男士偏好:

    • 遍历每个男士
    • 记录他们心仪的女士
    • 更新男士的配对需求数
  3. 处理女士偏好:

    • 遍历每个女士
    • 记录她们心仪的男士
    • 如果某个配对之前没出现过,更新女士的配对需求数
  4. 计算结果:

    • 找出男士中最大的配对需求数
    • 找出女士中最大的配对需求数
    • 两者相加即为所需的最少舞曲数

代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    
    // 初始化邻接矩阵和配对需求数组
    vector<vector<int>> Map(1001, vector<int>(1001, 0));
    vector<int> pairNeeds(n + m, 0);
    
    // 处理男士的偏好
    for(int i = 0; i < n; i++) {
        int k;
        cin >> k;
        for(int j = 0; j < k; j++) {
            int girl;
            cin >> girl;
            Map[i][n + girl - 1] = 1;
            pairNeeds[i]++;
        }
    }
    
    // 处理女士的偏好
    for(int i = 0; i < m; i++) {
        int k;
        cin >> k;
        for(int j = 0; j < k; j++) {
            int boy;
            cin >> boy;
            if(!Map[boy - 1][n + i]) {
                pairNeeds[n + i]++;
            }
            Map[boy - 1][n + i] = 1;
        }
    }
    
    // 计算结果
    int maxBoyNeeds = 0;
    for(int i = 0; i < n; i++) {
        maxBoyNeeds = max(maxBoyNeeds, pairNeeds[i]);
    }
    
    int maxGirlNeeds = 0;
    for(int i = n; i < n + m; i++) {
        maxGirlNeeds = max(maxGirlNeeds, pairNeeds[i]);
    }
    
    cout << maxBoyNeeds + maxGirlNeeds << endl;
    
    return 0;
}
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        
        // 初始化邻接矩阵和配对需求数组
        int[][] map = new int[1001][1001];
        int[] pairNeeds = new int[n + m];
        
        // 处理男士的偏好
        for(int i = 0; i < n; i++) {
            int k = sc.nextInt();
            for(int j = 0; j < k; j++) {
                int girl = sc.nextInt();
                map[i][n + girl - 1] = 1;
                pairNeeds[i]++;
            }
        }
        
        // 处理女士的偏好
        for(int i = 0; i < m; i++) {
            int k = sc.nextInt();
            for(int j = 0; j < k; j++) {
                int boy = sc.nextInt();
                if(map[boy - 1][n + i] == 0) {
                    pairNeeds[n + i]++;
                }
                map[boy - 1][n + i] = 1;
            }
        }
        
        // 计算结果
        int maxBoyNeeds = 0;
        for(int i = 0; i < n; i++) {
            maxBoyNeeds = Math.max(maxBoyNeeds, pairNeeds[i]);
        }
        
        int maxGirlNeeds = 0;
        for(int i = n; i < n + m; i++) {
            maxGirlNeeds = Math.max(maxGirlNeeds, pairNeeds[i]);
        }
        
        System.out.println(maxBoyNeeds + maxGirlNeeds);
    }
}
def solve_dance_party():
    # 读取输入
    n, m = map(int, input().split())
    
    # 初始化邻接矩阵和配对需求数组
    Map = [[0] * (n + m) for _ in range(n + m)]
    pair_needs = [0] * (n + m)
    
    # 处理男士的偏好
    for i in range(n):
        preferences = list(map(int, input().split()))
        k = preferences[0]
        for j in range(k):
            girl = preferences[j + 1]
            Map[i][n + girl - 1] = 1
            pair_needs[i] += 1
    
    # 处理女士的偏好
    for i in range(m):
        preferences = list(map(int, input().split()))
        k = preferences[0]
        for j in range(k):
            boy = preferences[j + 1]
            if not Map[boy - 1][n + i]:
                pair_needs[n + i] += 1
            Map[boy - 1][n + i] = 1
    
    # 计算结果
    max_boy_needs = max(pair_needs[:n])
    max_girl_needs = max(pair_needs[n:])
    
    print(max_boy_needs + max_girl_needs)

if __name__ == "__main__":
    solve_dance_party()

算法及复杂度

  • 算法:贪心算法
  • 时间复杂度: - 需要遍历所有可能的配对
  • 空间复杂度: - 需要邻接矩阵存储配对关系