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)算法求带权二分图的最佳匹配 相关概念 这个算法个人觉得一开始时有点难以理解它的一些概念,特别是新定义出来的,因为不知道是干嘛用的.但是,在了解了算法的执行过程和原理后, ...
随机推荐
- 【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- JeeSite试用
JeeSite主要定位于企业信息化领域.网址:http://www.oschina.net/p/jeesite 从描述来看,各种NB,下来看的最主要原因是最近还在更新,觉得有问题可以有一批人一起研究研 ...
- cocos2dx-html5 实现网页版flappy bird游戏
我也是第一次使用cocos2d_html5,对js和html5也不熟,看引擎自带的例子和引擎源码,边学边做,如果使用过cocos2d-x的话,完成这个游戏还是十分简单的.游戏体验地址: http:// ...
- 谨慎使用php的strtotime()函数
我们在日常业务中,针对业务量,经常会采用对数据库按时间做横向分表,分表后的查询往往会涉及到时间问题.例如,我们想查询某个用户距离当前时间1个月的订单情况,在这个时候,我们有些会用到strtotime( ...
- 那些年被我坑过的Python——道阻且长(第五章实用模块讲解)
random模块 我的随机验证吗程序: 首先保证了字母和数字出现的概率是50% VS 50%,其次是可以订制输出多少位 def Captcha(size): Captcha_list = [] for ...
- ACM组队安排
Problem Description ACM亚洲区比赛结束,意味着开始备战明年的浙江省大学生程序设计竞赛了! 杭州电子科技大学ACM集训队也准备开始组队. 教练想把所有的n个队员组成若干支队 ...
- windows下搭建PHP环境
1.Apache 下载地址:http://httpd.apache.org/download.cgi 下载之后进入CMD,/Apache/bin/httpd.exe -k install 进行安装 提 ...
- 关于html5
html5 是用来 将 js 和 css 结合起来 从而实现 各种功能 javascript 用来定义 html5 页面的逻辑 css 来定义 html5 中的显示样式
- Python的subprocess模块
尝试在Python中运行可执行文件,网上给出的解决方案是: import os os.system("此处填程序路径") 我要运行的程序文件名中有空格,因此果断失败了,查看了一下帮 ...
- ubuntu各版本的区别
ubuntu.kubuntu以及xubuntu的区别Ubuntu默认是Gnome:KUbuntu用的是KDE,效果比较炫目,但是系统要求也较高XUbuntu用的是Xface,比较轻量,系统要求较低,推 ...