hdu 3718

2014-11-23 22:04:31 来源: 作者: 浏览: 3

这题看了一会就发现是匹配问题,k个字母跟给出的k个字母间匹配,字母间上下建边,权值为1

就是求最优匹配了,

#include
#include
#define N 30
#define inf 0x3fffffff
int map[N][N],lx[N],ly[N],sx[N],sy[N],d[N],match[N],n;
int find(int x)
{
	int i;
	sx[x]=1;
	for(i=0;i<26;i++)
	{
		if(sy[i]==1)continue;
		int temp=lx[x]+ly[i]-map[x][i];
		if(temp==0)
		{
			sy[i]=1;
			if(match[i]==-1||find(match[i])==1)
			{
				match[i]=x;
				return 1;
			}
		}
		else d[i]=d[i]>temp temp:d[i];
	}
	return 0;
}
int KM()
{
	int i,j,k,min,sum;
	memset(match,-1,sizeof(match));
	memset(ly,0,sizeof(ly));
	for(i=0;i<26;i++)
	{
		lx[i]=map[i][0];
		for(j=1;j<26;j++)
			if(lx[i]d[k])
					min=d[k];
				for(j=0;j<26;j++)
				{
					if(sx[j]==1)lx[j]-=min;
					if(sy[j]==1)ly[j]+=min;
				}
		}
	}
	sum=0;
	for(i=0;i<26;i++)
	{
		sum+=map[match[i]][i];
	}
	return sum;
}
int main()
{
	int i,j,k,sum,m,t;
	char ch[3],str[10010];
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d",&k,&n,&m);
		  for(i=0;i 
 


-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: