现在的位置: 首页 > 综合 > 正文

hdu 1528&hdu 1962 (最大匹配)

2018年12月28日 ⁄ 综合 ⁄ 共 971字 ⁄ 字号 评论关闭

最大匹配裸题

两题题目都一样,第一个人的牌已经放好,问第二个人怎么放自己的牌赢得最多,

如果同一列的牌比对方大,就赢一次

将第二个人的每张牌与第一个人比较,如果大于第一个人的牌,两张牌就可以建一条边,

然后就是求最大匹配了







#include<stdio.h>
#include<string.h>
#define N 60
int n,map[N][N],x[N],y[N],match[N],vis[N];
int find(int x)
{
	int i;
	for(i=1;i<=n;i++)
	{
		if(vis[i]==0&&map[x][i]==1)
		{
			vis[i]=1;
			if(match[i]==-1||find(match[i])==1)
			{
				match[i]=x;
				return 1;
			}
		}
	}
	return 0;
}
int main()
{
    int i,j,k,t,sum;
	char str[3];
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(j=1;j<=2;j++)
		{
			for(i=1;i<=n;i++)
			{
				scanf("%s",str);
				if(str[0]>='2'&&str[0]<='9')
				{
					k=(str[0]-'2')*4;
				}
				else
				{
					if(str[0]=='T')
						k=8*4;
					else if(str[0]=='J')
						k=9*4;
					else if(str[0]=='Q')
						k=10*4;
					else if(str[0]=='K')
						k=11*4;
					else if(str[0]=='A')
						k=12*4;
				}
				if(str[1]=='C')
					k+=1;
				else if(str[1]=='D')
					k+=2;
				else if(str[1]=='S')
					k+=3;
				else if(str[1]=='H')
					k+=4;
				if(j==1)
					x[i]=k;
				else y[i]=k;
			}
		}
		memset(map,0,sizeof(map));
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
			{
				if(y[i]>x[j])
					map[i][j]=1;
			}
			memset(match,-1,sizeof(match));
			sum=0;
			for(i=1;i<=n;i++)
			{
				memset(vis,0,sizeof(vis));
				sum+=find(i);
			}
			printf("%d\n",sum);
	}
	return 0;
}


		
		

抱歉!评论已关闭.