HDU 3718 Similarity(KM算法)
来源:互联网 发布:东方金钰网络金融 编辑:程序博客网 时间:2024/05/21 00:00
把对应位置的字母边练起来,权值加一,最后求二分图最大权值即可。
#include<iostream>#include<cstring>using namespace std;const int maxn=30+5;int w[maxn][maxn],n,m;int lx[maxn],ly[maxn];int Left[maxn];bool s[maxn],t[maxn];char ss[35][20005];char tt[20005];bool match(int i){ s[i]=true; for(int j=1;j<=m;j++) if(lx[i]+ly[j]==w[i][j]&&!t[j]){ t[j]=true; if(Left[j]==-1||match(Left[j])){ Left[j]=i; return true; } } return false;}void update(){ int a=(1<<30); for(int i=1;i<=n;i++) if(s[i]) for(int j=1;j<=m;j++) if(!t[j]) a=min(a,lx[i]+ly[j]-w[i][j]); for(int i=1;i<=n;i++) if(s[i]) lx[i]-=a; for(int i=1;i<=m;i++) if(t[i]) ly[i]+=a;}void KM(){ memset(Left,-1,sizeof(Left)); memset(lx,0,sizeof(lx)); memset(ly,0,sizeof(ly)); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) lx[i]=max(lx[i],w[i][j]); } for(int i=1;i<=n;i++){ for(;;) { memset(s,0,sizeof(s)); memset(t,0,sizeof(t)); if(match(i)) break;else update(); } }}int r,k,c;int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&r,&k,&c); n=m=26; getchar();gets(tt); for(int i=0;i<c;i++) gets(ss[i]); for(int i=0;i<c;i++) { memset(w,0,sizeof(w)); for(int j=0;j<=2*(r-1);j+=2) { w[ss[i][j]-'A'+1][tt[j]-'A'+1]++; } KM(); int ans=0; for(int i=1;i<=26;i++) ans+=w[Left[i]][i]; printf("%.4f\n",(double)ans/r); } } return 0;}
0 0
- HDU 3718 Similarity KM算法
- HDU 3718 Similarity(KM算法)
- HDU 3718 Similarity【KM算法】
- hdu 3718 Similarity (二分图KM算法)
- hdu 3718 Similarity【KM匹配】
- HDU 3718 Similarity(KM最大匹配)
- HDU 3718 KM算法
- 【KM匹配】 HDOJ 3718 Similarity
- hdu 3718 Similarity
- Similarity HDU 3718||UVALive
- HDU 2255 KM算法
- hdu 1533KM算法
- hdu 1853 KM算法
- HDU 2255 (KM()算法)
- HDU-2255(KM算法)
- 【KM算法 模板】HDU
- hdu 2255KM算法模板
- hdu 2255(KM算法模板)
- 用Margin还是用Padding
- download
- maven(2)------maven构建项目
- VS2012不能启动谷歌调试
- 传多个参数到后台
- HDU 3718 Similarity(KM算法)
- 多线程
- 压缩感知重构算法之基追踪(Basis Pursuit, BP)
- 函数在运行中变量的查找
- hadoop完全分布式教程网页
- JVM
- mysql 表分区 查看表分区 修改表分区
- maven(3)------maven构建web项目详细步骤
- 纹理操作