hdu3722Card Game(KM最大带权匹配)
题目大意:给n个字符串,再给一个n的排列:p1,p2....pn。然后将第i个字符串贴到第pi个字符串后面,然后形成一个环。pi的首字符和第i个字符串的末尾字符就相邻,如果这2个字符相等,各自再向内延伸一个位置,知道这个环首尾字符不等为止。延伸的位置为该环的得分(如果pi == i,得分为0),对于每个排列,有n个这样的环,求得分和最大为多少。
题目分析:最大带权匹配!!以为是个字符串的题目,就没仔细看。。。
建图直接跑模版。。。
详情请见代码:
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 205;
const int M = 1005;
const int inf = 0x3f3f3f3f;
char s[N][M];
int n;
int lx[N],ly[N],w[N][N];
bool cx[N],cy[N];
int match[N];
int slack;
int getw(int x,int y)
{
int i,j;
i = strlen(s[x]) - 1;
j = 0;
int lenj = strlen(s[y]) - 1;
int ret = 0;
while(i >= 0 && j <= lenj && s[x][i] == s[y][j])
i --,j ++,ret ++;
return ret;
}
void predeal()
{
int i,j;
for(i = 1;i <= n;i ++)
{
for(j = 1;j <= n;j ++)
if(i == j)
w[i][j] = 0;
else
w[i][j] = getw(i,j);
}
}
bool path(int u)
{
cx[u] = true;
for(int v = 1;v <= n;v ++)
{
if(cy[v] == false)
{
int t = lx[u] + ly[v] - w[u][v];
if(t)
{
if(slack > t)
slack = t;
}
else
{
cy[v] = true;
if(match[v] == -1 || path(match[v]))
{
match[v] = u;
return true;
}
}
}
}
return false;
}
void KM()
{
int ans = 0;
int i,j;
for(i = 1;i <= n;i ++)
{
lx[i] = -inf;
ly[i] = 0;
for(j = 1;j <= n;j ++)
if(lx[i] < w[i][j])
lx[i] = w[i][j];
}
memset(match,-1,sizeof(match));
for(i = 1;i <= n;i ++)
{
while(1)
{
memset(cx,false,sizeof(cx));
memset(cy,false,sizeof(cy));
slack = inf;
if(path(i))
break;
for(j = 1;j <= n;j ++)
{
if(cx[j])
lx[j] -= slack;
if(cy[j])
ly[j] += slack;
}
}
}
for(i = 1;i <= n;i ++)
ans += w[match[i]][i];
printf("%d\n",ans);
}
int main()
{
while(scanf("%d",&n) != EOF)
{
for(int i = 1;i <= n;i ++)
scanf("%s",s[i]);
predeal();
KM();
}
return 0;
}
hdu3722Card Game(KM最大带权匹配)的更多相关文章
- 奔小康赚大钱---hdu2255(最大带权匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 带权匹配问题的模板: 运用KM算法: #include<stdio.h> #incl ...
- 【POJ 2400】 Supervisor, Supervisee(KM求最小权匹配)
[POJ 2400] Supervisor, Supervisee(KM求最小权匹配) Supervisor, Supervisee Time Limit: 1000MS Memory Limit ...
- 二分图的最大匹配以及带权匹配【匈牙利算法+KM算法】
二分图算法包括 匈牙利算法 与 KM算法. 匈牙利算法 在这里写上模板. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 #include< ...
- HDU - 2255 奔小康赚大钱(最大带权匹配)
Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓, ...
- poj 2195(KM求最小权匹配)
题目链接:http://poj.org/problem?id=2195 思路:我们都知道KM使用来求最大权匹配的,但如果要求最小权匹配,只需把图中的权值改为负值,求一次KM,然后权值和取反即可. ht ...
- HDU2255 奔小康赚小钱钱(二分图-最大带权匹配)
传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子 ...
- POJ3565带权匹配——km算法
题目:http://poj.org/problem?id=3565 神奇结论:当总边权最小时,任意两条边不相交! 转化为求二分图带权最小匹配. 可以用费用流做.但这里学一下km算法. https:// ...
- KM算法 带权二分匹配 O(n^3)
#include<cstdio> #include<cstdlib> #include<cstring> #include<string> #inclu ...
- KM(Kuhn-Munkres)算法求带权二分图的最佳匹配
KM(Kuhn-Munkres)算法求带权二分图的最佳匹配 相关概念 这个算法个人觉得一开始时有点难以理解它的一些概念,特别是新定义出来的,因为不知道是干嘛用的.但是,在了解了算法的执行过程和原理后, ...
随机推荐
- Struts2中使用execAndWait后,在 Action中调用getXXX()方法报告java.lang.NullPointerException异常的原因和解决方法
使用 Struts2 编写页面,遇到一个要长时间运行的接口,因此增加了一个execAndWait ,结果在 Action 中调用 getContext()的时候报告异常 ActionContext c ...
- 『重构--改善既有代码的设计』读书笔记----Remove Middle Man
如果你发现某个类做了过多的简单委托动作,你就可以考虑是否可以让客户直接去调用受托类.在Hide Delegate中,我们介绍了封装受托对象的好处,但好处归好处也存在代价,就是当你每次需要在受托对象中增 ...
- js 表达式与运算符 详解(下)
比较运算符: > .>= .<. <=. ==. !=. ===. !==. 比较运算符的结果都为布尔值 ==只比较值是否相等 而 ===比较的是值和数据类型都要 ...
- 拓扑排序-DFS
拓扑排序的DFS算法 输入:一个有向图 输出:顶点的拓扑序列 具体流程: (1) 调用DFS算法计算每一个顶点v的遍历完成时间f[v] (2) 当一个顶点完成遍历时,将该顶点放到一个链表的最前面 (3 ...
- CMD下查询Mysql中文乱码的解决方法
我的MySQL是默认utf8编码的,所建数据库也是设置utf8编码,使用程序可以新增中文数据,在cmd中使用SQL语句新增数据则报类似Incorrect string value: '\xB2\xE2 ...
- PHP面向对象(OOP):克隆对象__clone()方法
有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性,这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象, ...
- unix环境高级编程-读书笔记与习题解答-第一篇
从这周开始逐渐的进入学习状态,每天晚上都会坚持写c程序,并且伴随对这本书的深入,希望能写出更高质量的读书笔记和程序. 本书的第一章,介绍了一些关于unix的基础知识,在这里我不想去讨论linux到底是 ...
- Django db relationship
# coding=utf-8 from django.db import models """ Django数据库关系: 一对一关系:OneToOneField 多对多关 ...
- Windows Phone 学习笔记(一) 数据存储
独立存储设置IsolatedStorageSetting private IsolatedStorageSettings _appSettings; public MainPage() { Initi ...
- [BZOJ 1084] [SCOI2005] 最大子矩阵 【DP】
题目链接:BZOJ - 1084 题目分析 我看的是神犇BLADEVIL的题解. 1)对于 m = 1 的情况, 首先可能不取 Map[i][1],先 f[i][k] = f[i - 1][k]; ...