hdu 1528 二分匹配

#include<stdio.h>
#include<string.h>
int map[100][100],mark[100],link[100],max2,k;
int find(int u) {
 int i;
 for(i=1;i<=k;i++) {
  if(!mark[i]&&map[u][i]) {
   mark[i]=1;
   if(!link[i]||find(link[i])) {
    link[i]=u;
    return 1;
   }
  }
 }return 0;
}
int seach(char c) {
 if(c=='C')
  return 1;
 if(c=='D')
  return 2;
 if(c=='S')
  return 3;
 if(c=='H')
  return 4;
 if(c=='T')
  return 10;
 if(c=='J')
  return 11;
 if(c=='Q')
  return 12;
 if(c=='K')
  return 13;
 if(c=='A')
  return 14;
 if(c>='2'&&c<='9')
  return c-'0';
}
int main() {
 int i,j,sum,ans,ans2,t,a,b,diyi[100],dier[100];
 char c,ch;
 scanf("%d",&t);
 while(t--) {
  scanf("%d",&k);
  memset(map,0,sizeof(map));
  memset(link,0,sizeof(link));
  for(i=1;i<=k;i++) {
   scanf(" %c%c",&c,&ch);
   a=seach(c);
   b=seach(ch);
      diyi[i]=(a-1)*4+b;
  }
  for(i=1;i<=k;i++) {
    scanf(" %c%c",&c,&ch);
   a=seach(c);
   b=seach(ch);
      dier[i]=(a-1)*4+b;
  }
  sum=0;
  for(i=1;i<=k;i++)
   for(j=1;j<=k;j++)
    if(dier[i]>diyi[j])
     map[i][j]=1;//重要的地方不能写成map[dier[i]][diyi[j]]=1这样会超时巧妙地将其转化为k个数的比较
    for(i=1;i<=k;i++) {
     memset(mark,0,sizeof(mark));
     sum+=find(i);
    }
    printf("%d\n",sum);
    }
 return 0;
}
 

    

posted @ 2013-10-03 17:33  HYDhyd  阅读(125)  评论(0编辑  收藏  举报