题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1528
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1962
思路:求二分图的最小覆盖,最小覆盖=最大匹配;
建图略麻烦。。。
1 #include<iostream> 2 const int MAXN=30; 3 using namespace std; 4 int n; 5 bool map[MAXN][MAXN]; 6 int lx[MAXN],ly[MAXN]; 7 bool mark[MAXN]; 8 9 int dfs(int u){ 10 for(int i=1;i<=n;i++){ 11 if(!mark[i]&&map[u][i]){ 12 mark[i]=true; 13 if(ly[i]==-1||dfs(ly[i])){ 14 ly[i]=u; 15 lx[u]=i; 16 return true; 17 } 18 } 19 } 20 return false; 21 } 22 23 int MaxMatch(){ 24 int res=0; 25 memset(lx,-1,sizeof(lx)); 26 memset(ly,-1,sizeof(ly)); 27 for(int i=1;i<=n;i++){ 28 if(lx[i]==-1){ 29 memset(mark,false,sizeof(mark)); 30 res+=dfs(i); 31 } 32 } 33 return res; 34 } 35 36 int main(){ 37 int _case; 38 scanf("%d",&_case); 39 while(_case--){ 40 scanf("%d",&n); 41 char str1[MAXN][4],str2[MAXN][4]; 42 memset(map,false,sizeof(map)); 43 for(int i=1;i<=n;i++){ 44 scanf("%s",str1[i]); 45 } 46 for(int i=1;i<=n;i++){ 47 scanf("%s",str2[i]); 48 for(int j=1;j<=n;j++){ 49 if(str2[i][0]==str1[j][0]){ 50 if(str2[i][1]==str1[j][1])continue; 51 else if(str2[i][1]=='H'){ 52 map[i][j]=true; 53 }else if(str2[i][1]=='S'&&str1[j][1]!='H'){ 54 map[i][j]=true; 55 }else if(str2[i][1]=='D'&&str1[j][1]=='C'){ 56 map[i][j]=true; 57 } 58 }else if(str2[i][0]>='2'&&str2[i][0]<='9'){ 59 if(str1[j][0]>='2'&&str1[j][0]<='9'&&str2[i][0]>str1[j][0]){ 60 map[i][j]=true; 61 } 62 }else if(str2[i][0]=='T'&&str1[j][0]>='2'&&str1[j][0]<='9'){ 63 map[i][j]=true; 64 }else if(str2[i][0]=='J'&&(str1[j][0]>='2'&&str1[j][0]<='9'||str1[j][0]=='T')){ 65 map[i][j]=true; 66 }else if(str2[i][0]=='Q'&&str1[j][0]!='K'&&str1[j][0]!='A'){ 67 map[i][j]=true; 68 }else if(str2[i][0]=='K'&&str1[j][0]!='A'){ 69 map[i][j]=true; 70 }else if(str2[i][0]=='A'){ 71 map[i][j]=true; 72 } 73 } 74 } 75 int ans=MaxMatch(); 76 printf("%d\n",ans); 77 } 78 return 0; 79 }