就是找一个最大的集合,这个集合里的任意二个元素都没有题中的“romantically involved”关系,今天才知道最大独立集这个词,二分图的最大独立集=总元素个数n-最大匹配数/2;
比较烦这种不明确说明数据范围的题~~~
下面是用普通数组做的,时间1500多ms,而用vector做的,才500多ms!!!!!!,普通的代码最下面
#include<stdio.h> #include<string.h> #include<vector> using namespace std; vector<int>v[505]; int use[505]; int link[505]; int n; int dfs(int k) { for(int i=0;i<v[k].size() ;i++) { if(!use[v[k][i]]) { use[v[k][i]]=1; if(link[v[k][i]]==-1||dfs(link[v[k][i]])) { link[v[k][i]]=k; return 1; } } } return 0; } int main() { while(~scanf("%d",&n)) { for(int i=0;i<n;i++) { int a,b; scanf("%d: (%d)",&a,&b); for(int j=0;j<b;j++) { int c; scanf("%d",&c); v[a].push_back(c); } } int sum=0; memset(link,-1,sizeof(link)); for(int i=0;i<n;i++) { memset(use,0,sizeof(use)); if(dfs(i)) sum++; } printf("%d\n",n-sum/2); for(int i=0;i<n;i++)//谨记!每次清除vector { v[i].clear() ; } } return 0; }普通:
#include<stdio.h> #include<string.h> using namespace std; int mat[505][505]; int use[505]; int link[505]; int n; int dfs(int k) { for(int i=0;i<n;i++) { if(mat[k][i]==1&&!use[i]) { use[i]=1; if(link[i]==-1||dfs(link[i])) { link[i]=k; return 1; } } } return 0; } int main() { while(~scanf("%d",&n)) { memset(mat,0,sizeof(mat)); for(int i=0;i<n;i++) { int a,b; scanf("%d: (%d)",&a,&b); for(int j=0;j<b;j++) { int c; scanf("%d",&c); mat[a][c]=1; } } int sum=0; memset(link,-1,sizeof(link)); for(int i=0;i<n;i++) { memset(use,0,sizeof(use)); if(dfs(i)) sum++; } printf("%d\n",n-sum/2); } return 0; }