这题看了一会就发现是匹配问题,k个字母跟给出的k个字母间匹配,字母间上下建边,权值为1
就是求最优匹配了,
#include#include #define N 30 #define inf 0x3fffffff int map[N][N],lx[N],ly[N],sx[N],sy[N],d[N],match[N],n; int find(int x) { int i; sx[x]=1; for(i=0;i<26;i++) { if(sy[i]==1)continue; int temp=lx[x]+ly[i]-map[x][i]; if(temp==0) { sy[i]=1; if(match[i]==-1||find(match[i])==1) { match[i]=x; return 1; } } else d[i]=d[i]>temp temp:d[i]; } return 0; } int KM() { int i,j,k,min,sum; memset(match,-1,sizeof(match)); memset(ly,0,sizeof(ly)); for(i=0;i<26;i++) { lx[i]=map[i][0]; for(j=1;j<26;j++) if(lx[i]