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;}


原创粉丝点击