hdu 3722 二分图 最优完备匹配 KM算法
这题只要想到是最优完备匹配就行了;
题意:给出n个字符串,若两两相连,将前一个反置添加到后一个后面,相连的值为两个字串从头开始相等的字符个数;
问如何匹配得出最大值;
思路:建图,套模板。
代码:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- #define CLR(arr, what) memset(arr, what, sizeof(arr))
- #define maxn 305
- #define INF (1<<30)-1
- int g[maxn][maxn];
- int lx[maxn],ly[maxn],match[maxn];
- bool visx[maxn],visy[maxn];
- int slack[maxn];
- int n,m;
- char str[maxn][10001];
- bool dfs(int cur){
- visx[cur] = true;
- for(int y=1;y<=m;y++){
- if(visy[y]) continue;
- int t=lx[cur]+ly[y]-g[cur][y];
- if(t==0){
- visy[y] = true;
- if(match[y]==-1||dfs(match[y])){
- match[y] = cur;
- return true;
- }
- }
- else if(slack[y]>t){
- slack[y]=t;
- }
- }
- return false;
- }
- int KM(){
- CLR(match,-1);
- CLR(ly,0);;
- for(int i=1 ;i<=n;i++){
- lx[i]=-INF;
- for(int j=1;j<=m;j++)
- if(g[i][j]>lx[i]) lx[i]=g[i][j];
- }
- for(int x=1;x<=n;x++){
- for(int i=1;i<=m;i++) slack[i]=INF;
- while(true){
- CLR(visx,false);
- CLR(visy,false);
- if(dfs(x)) break;
- int d=INF;
- for(int i=1;i<=m;i++){
- if(!visy[i]&&d>slack[i]) d=slack[i];
- }
- for(int i=1;i<=n;i++){
- if(visx[i]) lx[i]-=d;
- }
- for(int i=1;i<=m;i++){
- if(visy[i]) ly[i]+=d;
- else slack[i]-=d;
- }
- }
- }
- int result = 0;
- for(int i = 1; i <=m; i++)
- if(match[i]!=-1)
- result += g[match[i]][i];
- return result;
- }
- int solve(int i,int j)
- {
- if(i==j) return 0;
- int len1=strlen(str[i]);
- int len2=strlen(str[j]);
- int P = len1-1;
- int Q = 0;
- while(P >= 0 && Q < len2 && str[i][P] == str[j][Q])
- {
- P--;
- Q++;
- }
- return Q;
- }
- int main(){
- while(scanf("%d",&n)!=EOF){
- CLR(g,0);
- m=n;
- for(int i=1;i<=n;i++)
- {
- scanf("%s",str[i]);
- }
- for(int i=1;i<=n;i++)
- {
- for(int j=1;j<=n;j++)
- {
- int k=solve(i,j);
- g[i][j]=k;
- }
- }
- printf("%d\n",KM());
- }
- return 0;
- }
hdu 3722 二分图 最优完备匹配 KM算法的更多相关文章
- 二分图最大权值匹配 KM算法 模板
KM算法详解+模板 大佬讲的太好了!!!太好了!!! 转载自:http://www.cnblogs.com/wenruo/p/5264235.html KM算法用来求二分图最大权完美匹配. 本文配合该 ...
- HDU2255-奔小康赚大钱-二分图最大权值匹配-KM算法
二分图最大权值匹配问题.用KM算法. 最小权值的时候把权值设置成相反数 /*-------------------------------------------------------------- ...
- 【模板】二分图最大权完美匹配KM算法
hdu2255模板题 KM是什么意思,详见百度百科. 总之知道它可以求二分图最大权完美匹配就可以了,时间复杂度为O(n^3). 给张图. 二分图有了边权,求最大匹配下的最大权值. 所以该怎么做呢?对啊 ...
- 二分图最大权完美匹配KM算法
KM算法二分图 KM求得二分图与普通二分图的不同之处在于:此二分图的每条边(男生女生)上都附了权值(好感度).然后,求怎样完美匹配使得权值之和最大. 这,不止一般的麻烦啊. 可以通过一个期望值来求. ...
- 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 二分图最大权匹配——KM算法
前言 这东西虽然我早就学过了,但是最近才发现我以前学的是假的,心中感慨万千(雾),故作此篇. 简介 带权二分图:每条边都有权值的二分图 最大权匹配:使所选边权和最大的匹配 KM算法,全称Kuhn-Mu ...
- 训练指南 UVALive - 4043(二分图匹配 + KM算法)
layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...
- Hdu2255 奔小康赚大钱(二分图最大权匹配KM算法)
奔小康赚大钱 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好 ...
- 二分图 最大权匹配 km算法
这个算法的本质还是不断的找增广路: KM算法的正确性基于以下定理:若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最 ...
随机推荐
- 利用python发送邮件
找了很多使用python发送邮件的文章, 发现写的并不是太全, 导致坑特别多, 刚把这个坑跨过去, 在此记录下来 本代码使用163作为发送客户端, 接收邮箱随意 首先登录163邮箱, 开启POP3/S ...
- PDF修改器
亲测可用的绿色版PDF修改器供大家分享使用 下载地址:http://pan.baidu.com/s/1pLPnhQb
- Java微信公众平台开发之OAuth2.0网页授权
根据官方文档点击查看在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的"开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息"的配置选项中,修 ...
- web添加第三方应用,前端解决跨域问题的8种方案
应用场景 web应用通过QQ登录授权实现第三方登录. 操作步骤 1. 注册成为QQ互联平台开发者,http://connect.qq.com/ 2. 准备一个可访问的域名,如dev.foo.com 3 ...
- URL的概念
URL(Uniform Resource Locator)直接翻译为"统一资源定位符" URL的作用:描述一个在网络上的资源 schema://host[:port#]/path/.../[? ...
- C语言开篇
Linux下使用最广泛的C/C++编译器是GCC,大多数的Linux发行版本都默认安装,不管是开发人员还是初学者,一般都将GCC作为Linux下首选的编译工具. 1.小程序test_gets.c #i ...
- IPython+:一个交互式计算和开发环境
一. IPython基础 代码自动补全:Tab键 可补全内容包括:变量名.函数名.成员变量函数.目录文件 内省(Itrospection) 在变量名之前或之后加上问号(?),这样可以显示这个对象的相关 ...
- vue.js开发环境搭建以及创建一个vue实例
Vue.js 是一套构建用户界面的渐进式框架.Vue 只关注视图层, 采用自底向上增量开发的设计.Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 在使用 vue.js ...
- 前端应该知道的Web Components
前端组件化的痛点 在前端组件化横行的今天,确实极大的提升了开发效率.不过有一个问题不得不被重视,拟引入的这些html.css.js代码有可能对你的其他代码造成影响. 虽然我们可以通过命名空间.闭包等一 ...
- Charles使用(二)
Charles使用(二) 破解Charles 找到Charles应用-->右键显示包内容--->contents-->java:更换Charles.jar即可 链接: https ...