UVAlive 5027 card game KM

来源:互联网 发布:sql启动不了怎么办 编辑:程序博客网 时间:2024/06/06 04:00


以为思路错、模板错WA了好久

原来是看错题,吸取教训了!

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cstdlib>using namespace std;#define N 300#define INF 20000000int cal(char *a,char *b){int lena=strlen(a);int lenb=strlen(b);int i=lena-1,j=0;for(;i>=0&&j<lenb;--i,++j)if(a[i]!=b[j])break;return j;}int n,map[N][N],lx[N],ly[N],visx[N],visy[N],matchy[N],ans,slack;char a[250][1200];bool dfs(int u){visx[u]=1;for(int i=1;i<=n;++i)if(!visy[i]){int temp=lx[u]+ly[i]-map[u][i];if(temp==0){visy[i]=1;if(matchy[i]==0||dfs(matchy[i])){matchy[i]=u;return true;}}else if(temp<slack)slack=temp;}return false;}void KM(){memset(ly,0,sizeof(ly));memset(matchy,0,sizeof(matchy));for(int i=1;i<=n;++i){lx[i]=-INF;for(int j=1;j<=n;++j)if(map[i][j]>lx[i])lx[i]=map[i][j];}for(int i=1;i<=n;++i)while(1){memset(visx,0,sizeof(visx));memset(visy,0,sizeof(visy));slack=INF;if(dfs(i))break;for(int j=1;j<=n;++j)if(visx[j])lx[j]-=slack;for(int j=1;j<=n;++j)if(visy[j])ly[j]+=slack;}ans=0;for(int i=1;i<=n;++i){ans+=map[matchy[i]][i];}}int main (){while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;++i)scanf("%s",a[i]);memset(map,0,sizeof(map));for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)map[i][j]=(i==j?0:cal(a[i],a[j]));KM();printf("%d\n",ans);}return 0;}


原创粉丝点击