博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 3722 二分图 最优完备匹配 KM算法
阅读量:6208 次
发布时间:2019-06-21

本文共 2243 字,大约阅读时间需要 7 分钟。

这题只要想到是最优完备匹配就行了;

题意:给出n个字符串,若两两相连,将前一个反置添加到后一个后面,相连的值为两个字串从头开始相等的字符个数;

问如何匹配得出最大值;

思路:建图,套模板。

代码:

#include
#include
#include
#include
using namespace std;#define CLR(arr, what) memset(arr, what, sizeof(arr))#define maxn 305#define INF (1<<30)-1int 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;}

转载于:https://www.cnblogs.com/amourjun/p/5134101.html

你可能感兴趣的文章
图嵌入综述 (arxiv 1709.07604) 译文五、六、七
查看>>
垃圾回收算法优缺点对比
查看>>
正则表达式 匹配常用手机号 (13、15\17\18开头的十一位手机号)
查看>>
GitLab 11.9 正式发布,自动化工具 ChatOps 已开源
查看>>
交换机的基本原理配置(一)
查看>>
android baidupush
查看>>
Lottie 站在巨人的肩膀上实现 Android 酷炫动画效果
查看>>
Linux_异常_08_本机无法访问虚拟机web等工程
查看>>
“陪护机器人”研报:距离真正“陪护”还差那么一点
查看>>
深入框架本源系列 —— Virtual Dom
查看>>
mongodb分布式集群搭建手记
查看>>
您有一个上云锦囊尚未领取!
查看>>
Java Web的web.xml文件作用及基本配置(转)
查看>>
区块链101:区块链的应用和用例是什么?
查看>>
马约拉纳费米子:推动量子计算的“天使粒子”
查看>>
瑞立视:厚积薄发且具有“工匠精神”的中国品牌
查看>>
git与svn的区别 ?Git 与 SVN那个更好?
查看>>
使用ActionTrail Python SDK
查看>>
数据显示,中国近一半的独角兽企业由“BATJ”四巨头投资
查看>>
log日志轮转--logrotate
查看>>