HDU1528(二分图匹配)

题意:一个人把手牌放在桌子上,另一个人的牌还在手中,他需要调整出牌顺序,是自己能赢得更多的局数,输出最大能赢得局数。
说白了就是个二分图匹配,不过那两个点相连需要自己写函数判断。
code:

#include
#include
#include
#include
#include
#include
#include 
//a&3==a%4
using namespace std;
const double eps=1e-8;
const int MAXN = 5010;//点数的最大值
const int MAXM = 50010;//边数的最大值
char color[10]={'C','D','S','H'};
char num[20]={'2','3','4','5','6','7','8','9','T','J','Q','K','A'};
struct Edge
{
    int to,next;
}edge[MAXM];
int head[MAXN],tot;
void init()
{
    tot = 0;
    memset(head,-1,sizeof(head));
}
void addedge(int u,int v)
{
    edge[tot].to = v; edge[tot].next = head[u];
    head[u] = tot++;
}
int linker[MAXN];
bool used[MAXN];
int uN;
bool dfs(int u)
{
    for(int i = head[u]; i != -1 ;i = edge[i].next)
    {
        int v = edge[i].to;
        if(!used[v])
        {
            used[v] = true;
            if(linker[v] == -1 || dfs(linker[v]))
            {
                linker[v] = u;
                return true;
            }
        }
    }
    return false;
}
int hungary()
{
    int res = 0;
    memset(linker,-1,sizeof(linker));
    for(int u = 0; u < uN;u++)//点的编号0~uN-1
    {
        memset(used,false,sizeof(used));
        if(dfs(u))res++;
    }
    return res;
}
bool judge(string x,string y)
{
    int shu1,se1;
    int shu2,se2;
    for(int i=0;i<13;i++)
    {
        if(x[0]==num[i])
            shu1=i;
        if(y[0]==num[i])
            shu2=i;
    }
    for(int i=0;i<4;i++)
    {
        if(x[1]==color[i])
            se1=i;
        if(y[1]==color[i])
            se2=i;
    }
    if(shu1>shu2)
    {
        return false;
    }
    else if(shu1return true;
    }
    else
    {
        if(se1>se2)
            return false;
        else return true;
    }
}
int main()
{

    int kase;
    int n;
    scanf("%d",&kase);
    while(kase--)
    {
        init();
        memset(linker,0,sizeof(linker));
        memset(used,0,sizeof(used));
        scanf("%d",&n);
        uN=n;
        string a[50];
        string b;
     //   memset(a,0,sizeof(a));

        for(int i=0;icin>>a[i];
        }
        for(int i=0;icin>>b;
            for(int j=0;jif(judge(a[j],b))
                {
                    addedge(i,j);
                }
            }
        }
        int res=hungary();
        printf("%d\n",res);
    }
    return 0;
}

你可能感兴趣的:(hdu,二分图匹配)