解题思路
这是一道二分图匹配相关的问题,主要思路如下:
-
数据结构:
- 使用邻接矩阵
Map[1001][1001]
存储配对关系 - 使用
vector
记录每个人需要配对的次数
- 使用邻接矩阵
-
处理男士偏好:
- 遍历每个男士
- 记录他们心仪的女士
- 更新男士的配对需求数
-
处理女士偏好:
- 遍历每个女士
- 记录她们心仪的男士
- 如果某个配对之前没出现过,更新女士的配对需求数
-
计算结果:
- 找出男士中最大的配对需求数
- 找出女士中最大的配对需求数
- 两者相加即为所需的最少舞曲数
代码
#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()
算法及复杂度
- 算法:贪心算法
- 时间复杂度:
- 需要遍历所有可能的配对
- 空间复杂度:
- 需要邻接矩阵存储配对关系