题目
分析
-
因为每个女生一定能找到男生
- 所以我们可以跑一遍最大匹配,先找男生与女生相配关系
- 然后我们枚举男生查找如果没了这个男生,那么这个女生是否还能找到另一个
代码
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<vector> 5 using namespace std; 6 vector <int> f[1001]; 7 int ans[1001]; 8 bool vis[1001]; 9 int link[1001],g[1001]; 10 bool find(int x) 11 { 12 for (int i=0;i<f[x].size();i++) 13 { 14 int y=f[x][i]; 15 if (!vis[y]) 16 { 17 vis[y]=true; 18 int q=link[y]; 19 link[y]=x; 20 if (q==0||find(q)) return true; 21 link[y]=q; 22 } 23 } 24 return false; 25 } 26 int main () 27 { 28 int n,m; 29 cin>>n>>m; 30 for (int i=1,k;i<=n;i++) 31 { 32 cin>>k; 33 for (int j=1,x;j<=k;j++) 34 { 35 cin>>x; 36 f[i].push_back(x); 37 } 38 } 39 for (int i=1;i<=n;i++) 40 { 41 memset(vis,0,sizeof(vis)); 42 find(i); 43 } 44 memcpy(g,link,sizeof link); 45 for (int i=1;i<=m;i++) 46 { 47 if (g[i]) 48 { 49 memset(vis,0,sizeof(vis)); 50 vis[i]=1; 51 memcpy(link,g,sizeof g); 52 if (!find(link[i])) cout<<i<<endl; 53 } 54 } 55 }