計蒜客/填志愿(匈牙利算法)
題目鏈接:https://nanti.jisuanke.com/t/50
題意:中文題誒~
思路:二分圖最大匹配 (匈牙利模板)
代碼:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 6 const int MAXN=2e2+10; 7 int link[MAXN]; //link[x]存儲當前與x節點相連的節點 8 int mp[MAXN][MAXN];//臨接矩陣記錄圖 9 bool vis[MAXN];//vis[i]標記i節點是否使用過 10 int n, m; 11 12 bool dfs(int x){ 13 for(int i=1; i<=m; i++){ 14 if(!vis[i]&&mp[x][i]){ 15 vis[i]=true; 16 if(link[i]==-1||dfs(link[i])){ 17 link[i]=x; 18 return true; 19 } 20 } 21 } 22 return false; 23 } 24 25 int maxmatch(void){ 26 int ans=0; 27 memset(link, -1, sizeof(link)); 28 for(int i=1; i<=n; i++){ 29 memset(vis, false, sizeof(vis)); 30 if(dfs(i)) ans++; 31 } 32 return ans; 33 } 34 35 int main(void){ 36 scanf("%d%d", &n, &m); 37 for(int i=1; i<=n; i++){ 38 int k, x; 39 scanf("%d", &k); 40 for(int j=0; j<k; j++){ 41 scanf("%d", &x); 42 mp[i][x]=1; 43 } 44 } 45 printf("%d\n", maxmatch()); 46 return 0; 47 }
我就是我,颜色不一样的烟火 --- geloutingyu