首页 > 其他 > 详细

Card Game Cheater HDU1528

时间:2019-02-12 14:05:29      阅读:122      评论:0      收藏:0      [点我收藏+]

二分图最大匹配问题 

扑克题还是用map比较方便 

#include<bits/stdc++.h>
using namespace std;
#define MAXI 52
int yd[MAXI][2];
int xw[MAXI][2];
int used[MAXI];
int vis[MAXI];
int n,m;

map<char,int>mm;

bool judge(int a,int b)
{
   if( mm[xw[a][0]]>mm[ yd[b][0] ] )
    return true;
   else if(mm[xw[a][0]]==mm[ yd[b][0] ])
    return mm[xw[a][1]]>mm[ yd[b][1] ];
   else
    return false;
}

bool dfs(int  x)//x指夏娃数组下标
{
    for(int j=1;j<=n;j++)//j是亚当的
    {
        if(judge(x,j)&&!used[j])
        {
            used[j]=1;
            if(!vis[j]||dfs(vis[j]) )
              {
                  vis[j]=x;
                  return true;
              }
        }
    }
    return false;
}

int find1(void)
{    int ans=0;
     memset(vis,0,sizeof(vis));
     for(int i=1;i<=n;i++)//这里的i指的是夏娃的
       {
           memset(used,0,sizeof(used));
           if(dfs(i))ans++;
       }
       return ans;
}

int main()
{
  int cas;
  cin>>cas;
  for(char i=2;i<=9;i++)
      mm[i]=i-0;
  mm[T]=10;
  mm[J]=11;
  mm[Q]=12;
  mm[K]=13;
  mm[A]=14;
  mm[C]=1;
  mm[D]=2;
  mm[S]=3;
  mm[H]=4;
  int first=1;
  while(cas--)
  {
     scanf("%d",&n);
     char s[5];
     for(int i=1;i<=n;i++)
     {
         scanf("%s",s);
         yd[i][0]=s[0];
         yd[i][1]=s[1];
     }
      for(int i=1;i<=n;i++)
      {
          scanf("%s",s);
          xw[i][0]=s[0];
          xw[i][1]=s[1];
      }
      printf("%d\n",find1());
  }
  return 0;
}

 

Card Game Cheater HDU1528

原文:https://www.cnblogs.com/bxd123/p/10364756.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!