hdu3718Similarity
来源:互联网 发布:织梦cms漏洞利用工具 编辑:程序博客网 时间:2024/05/16 05:16
题意:匹配两个串,求最大匹配数。匹配的两个串形似即可。
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int oo=1e7;const int mm=111111;const int mn=8888;int node,src,dest,edge;int ver[mm],flow[mm],cost[mm],next[mm];int head[mn],dis[mn],p[mn],q[mn],vis[mn],work[mn];int g[50][50];void prepare(int _node,int _src,int _dest){ node=_node,src=_src,dest=_dest; for(int i=0;i<node;++i)head[i]=-1,vis[i]=0; edge=0;}void addedge(int u,int v,int f,int c){ ver[edge]=v,flow[edge]=f,cost[edge]=c,next[edge]=head[u],head[u]=edge++; ver[edge]=u,flow[edge]=0,cost[edge]=-c,next[edge]=head[v],head[v]=edge++;}bool spfa(){ int i,u,v,l,r=0,tmp; for(i=0;i<node;i++) dis[i]=-oo; dis[q[r++]=src]=0; p[src]=p[dest]=-1; for(l=0;l!=r;(++l>=mn)?l=0:l) for(i=head[u=q[l]],vis[u]=0;i>=0;i=next[i]) if(flow[i]&&dis[v=ver[i]]<(tmp=dis[u]+cost[i])) { dis[v]=tmp;//cout<<"u="<<u<<" v="<<v<<" tmp="<<tmp<<endl; p[v]=i^1; if(vis[v]) continue; vis[q[r++]=v]=1; if(r>=mn) r=0; } return p[dest]>-1;}int Spfaflow(){ int i,ret=0,delta; while(spfa()) { for(i=p[dest],delta=oo;i>=0;i=p[ver[i]]) if(flow[i^1]<delta) delta=flow[i^1]; for(i=p[dest];i>=0;i=p[ver[i]]) flow[i]+=delta,flow[i^1]-=delta; ret+=delta*dis[dest];//cout<<"ret="<<ret<<endl; } return ret;}int main(){ int t,n,k,m,i,j,ans; char c[10],str[11111]; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&k,&m); for(i=1;i<=n;i++) { scanf("%s",c); str[i]=c[0]; } while(m--) { prepare(54,0,53); for(i=1;i<=26;i++) { addedge(src,i,1,0); addedge(i+26,dest,1,0); } memset(g,0,sizeof(g)); for(i=1;i<=n;i++) { scanf("%s",c); g[str[i]-'A'+1][c[0]-'A'+1]++; } for(i=1;i<=26;i++) { for(j=1;j<=26;j++) { if(g[i][j]>0) addedge(i,j+26,oo,g[i][j]); } } ans=Spfaflow(); double nn=double(n); printf("%.4lf\n",ans/nn); } } return 0;}
- hdu3718Similarity
- hdu3718Similarity KM算法
- HDU3718Similarity(KM最大匹配)
- c和c++变量的存储
- Oracle 获取当前日期及日期格式
- C#多线程编程
- SQL中的Order By
- poj 2723 Get Luffy Out(2-sat构图题)
- hdu3718Similarity
- 类似查询mysql数据库的查询XML的JS类
- oracle都有哪些系统表,分别是做什么用的
- ExecutorService线程池
- 面试题之10亿正整数问题
- Unix(Solaris)基本命令
- DataGrid绑定数据固定的小数位数
- Linux命令杂集
- C语言 求一个大数的阶乘