题目可以转化为2个集合,x集合和y集合,其中的元素是1-n个字符串。

首先预处理点与点的边权,然后直接用二分图的最大权匹配模板。

#include<stdio.h>
#include<string.h>
#define N 210
#define inf 0x3fffffff
int map[N][N],match[N],lx[N],ly[N],sx[N],sy[N],d[N],n;
int find(int x)
{
sx[x]=1;
for(int i=0;i<n;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,sum,min;
memset(match,-1,sizeof(match));
memset(ly,0,sizeof(ly));
for(i=0;i<n;i++)
{
lx[i]=map[i][0];
for(j=1;j<n;j++)
if(map[i][j]>lx[i])
lx[i]=map[i][j];
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
d[j]=inf;
while(1)
{
memset(sx,0,sizeof(sx));
memset(sy,0,sizeof(sy));
if(find(i)==1)break;
min=inf;
for(k=0;k<n;k++)
if(sy[k]==0&&min>d[k])
min=d[k];
for(j=0;j<n;j++)
{
if(sx[j]==1)lx[j]-=min;
if(sy[j]==1)ly[j]+=min;
}
}
}
sum=0;
for(i=0;i<n;i++)
sum+=map[match[i]][i];
return sum;
}
int main()
{
int i,j,k,sum,p;
char str[201][1001];
while(scanf("%d",&n)!=-1)
{
for(i=0;i<n;i++)
scanf("%s",str[i]);
memset(map,0,sizeof(map));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
for(p=strlen(str[i])-1,k=0;str[j][k]&&p>=0;p--,k++)
{
if(str[i][p]!=str[j][k])break;
}
map[i][j]=k;
}
sum=KM();
printf("%d\n",sum);
}
return 0;
}

hdu 3722 Card Game 二分图的最大权匹配的更多相关文章

  1. 算法笔记_139:二分图的最大权匹配(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为二分图的最大权匹配问题? 最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大. 2 解决方案 对于此问题的讲解 ...

  2. Java实现二分图的最大权匹配

    1 问题描述 何为二分图的最大权匹配问题? 最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大. 2 解决方案 解决这个问题可以用KM算法.理解KM算法需要首先理解& ...

  3. hdu 2255 奔小康赚大钱 最大权匹配KM

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事 ...

  4. HDU 2255.奔小康赚大钱 最大权匹配

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  5. HDU(2255),KM算法,最大权匹配

    题目链接 奔小康赚大钱 Time Limit: 1000/1000MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  6. 二分图 最大权匹配 km算法

    这个算法的本质还是不断的找增广路: KM算法的正确性基于以下定理:若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最 ...

  7. km算法(二分图最大权匹配)学习

    啦啦啦! KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转 化为求完备匹配的问题的.设顶点Xi的顶标为A[i],顶点Yi的顶标为B[i],顶点Xi与Yj之间的边权为w[i,j].在 ...

  8. hdu 2255 二分图最大权匹配 *

    题意:说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房 ...

  9. 二分图最大权匹配问题&&KM算法讲解 && HDU 2255 奔小康赚大钱

    作者:logosG 链接:https://www.cnblogs.com/logosG/p/logos.html (讲解的KM算法,特别厉害!!!) KM算法: 现在我们来考虑另外一个问题:如果每个员 ...

随机推荐

  1. android开发之---文字居中---android中去掉标题栏

    1. 让textView里面的内容水平居中 :    android:gravity="center_horizontal" 2. 让textView控件在它的父布局里水平居中   ...

  2. cursor:hand与cursor:pointer的区别介绍

    cursor:hand 与 cursor:pointer 的效果是一样的,都像光标指向链接一样,光标变成手行. cursor:hand :IE完全支持.但是在firefox是不支持的,没有效果. cu ...

  3. POJ1269+直线相交

    求相交点 /* 线段相交模板:判相交.求交点 */ #include<stdio.h> #include<string.h> #include<stdlib.h> ...

  4. [Gauss]POJ1830 开关问题

    中文题 题意不多说 这题乍一看 就是求个自由未知量个数 相当简单 其实呢 其中要注意的细节还是很多的: 1.光求了自由未知量个数 还不够 ∵求的是可行方案的总数  因此 答案是 2^(自由未知量个数) ...

  5. JavaWeb学习总结(十三)——使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  6. C# ASP.NET FILEUPLOAD详解

    显示一个文本框控件和一个浏览按钮,使用户可以选择要上载到服务器的文件. 命名空间: System.Web.UI.WebControls 程序集: System.Web(在 system.web.dll ...

  7. 【HDOJ】1114 Piggy-Bank

    DP,先将coins按照重量排序可以优化. #include <stdio.h> #include <stdlib.h> #define MAXNUM 10005 #defin ...

  8. 海量数据的二度人脉挖掘算法(Hadoop 实现)

    最近做了一个项目,要求找出二度人脉的一些关系,就好似新浪微博的“你可能感兴趣的人” 中,间接关注推荐:简单描述:即你关注的人中有N个人同时都关注了 XXX . 在程序的实现上,其实我们要找的是:若 U ...

  9. Android Root原理

    概述:通过阅读本文可以深刻理解Android系统中获得Root权限的方法和原理.本文会详细介绍Root的目的,原理和代码层次的具体实现方法. Android Root介绍: 1. Root目的 手机获 ...

  10. 函数 flst_get_first

    /********************************************************************//** Gets list first node addre ...