FOJ--英语考试(最小生成树)

来源:互联网 发布:新疆广电网络缴费方式 编辑:程序博客网 时间:2024/06/06 15:42

                                                    英语考试

                                                                                                                         (题目链接)


就是一个最小生成树问题!
先把所有的路径(汉明)打出来存起来
然后走最小生成树!!!
#include<stdio.h>#include<iostream>#include<string.h>#include<queue>using namespace std;const int inf=0x3f3f3f3f;char s[1010][15];int map[1010][1010];bool book[1010];int dis[1010];int n,m,w;int hanming(char a[],char b[]){    int sum=0;    for(int i=0;i<m;i++)    {        if(a[i]!=b[i])        {            sum++;        }    }    return sum*w;}int main(){    while(~scanf("%d%d%d",&n,&m,&w))    {        int count=0,sum=0;        for(int i=1;i<=n;i++)        {            dis[i]=inf;        }        for(int i=1;i<=n;i++)        {            scanf("%s",s[i]);        }        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)            {                map[i][j]=hanming(s[i],s[j]);                if(map[i][j]>m)                    map[i][j]=m;            }        }        memset(book,0,sizeof(book));        for(int i=1;i<=n;i++)//初始化            dis[i]=map[1][i];        book[1]=1;        count++;        sum=m;        while(count<n)        {            int min=inf;            int dian;            for(int i=1;i<=n;i++)            {                if(!book[i]&&dis[i]<min)                {                    min=dis[i];                    dian=i;                }            }            book[dian]=1;count++;sum+=dis[dian];            for(int k=1;k<=n;k++)            {                if(book[k]==0&&dis[k]>map[dian][k])                    dis[k]=map[dian][k];            }        }        printf("%d\n",sum);    }}