Truck History POJ

来源:互联网 发布:美工培训讲师简介 编辑:程序博客网 时间:2024/06/04 13:01
/**n个车牌号,刚开始只有一个车牌,其他车牌都是由一个车牌直接或间接产生一个车牌到另一个车牌的产生权值是它们之间的字母不同的个数问产生的最小的边权和prim 最小生成树*/#include<cstdio>#include<cmath>#include<cstring>using namespace std;const int inf=0x3f3f3f3f;const int maxn=2e3+7;int dis[maxn],mmp[maxn][maxn],ans,val[maxn];bool vis[maxn];int n,m;char str[maxn][maxn];void build_map(){    for(int i=1;i<n;i++)    {        for(int j=i+1;j<=n;j++)        {            int sum=0,len=strlen(str[i]);            for(int k=0;k<len;k++)                if(str[i][k]!=str[j][k]) sum++;            mmp[i][j]=mmp[j][i]=sum;        }    }}void prim(){    ans=0;    for(int i=1;i<=n;i++)    {        dis[i]=mmp[1][i];        vis[i]=0;    }    vis[1]=1;    for(int i=1;i<=n;i++)    {        int k=-1;        double Min=inf;        for(int j=1;j<=n;j++)        {            if(!vis[j]&&dis[j]<Min)            {                Min=dis[j];                k=j;            }        }        if(k==-1) break;        vis[k]=1;        ans+=Min;        for(int j=1;j<=n;j++)            if(!vis[j]&&dis[j]>mmp[k][j])            dis[j]=mmp[k][j];    }    printf("The highest possible quality is 1/%d.\n",ans) ;}int main (){    while(~scanf("%d",&n)&&n)    {        for(int i=1;i<=n;i++)           for(int j=1;j<=n;j++)              if(i==j) mmp[i][j]=0;           else mmp[i][j]=inf;        for(int i=1;i<=n;i++)            scanf("%s",str[i]);        build_map();        prim();    }    return 0;}
原创粉丝点击