POJ 1789

来源:互联网 发布:淘宝联盟什么时候结算 编辑:程序博客网 时间:2024/05/19 00:52
//11163000c00h00g1789Accepted15844K657MSG++1411B2013-01-07 12:35:43 用kruskal的话需要计算边的个数没有prim方便#include<stdio.h>#include<stdlib.h>#include<string.h>int N;char input[2005][8];int quality(const char* a,const char* b){    int res=0;    for(int i=0;i<7;i++){        if(a[i]!=b[i])            res++;    }    return res;}int dis[2005][2005];int d[2005];int vis[2005]; //起点设置为0int main(){    while(scanf("%d",&N)!=EOF){        if(N==0)            break;        memset(vis,0,sizeof(vis));        for(int i=0;i<N;i++)            scanf("%s",input[i]);                for(int i=0;i<N;i++)            for(int j=0;j<N;j++){                if(i==j)                    dis[i][j]=0;                else                    dis[i][j]=quality(input[i],input[j]);            }        for(int i=0;i<N;i++)            d[i]=dis[0][i];        vis[0]=1;        //循环次数         int min,v,res=0;        for(int i=0;i<N-1;i++){            min=10000;            //寻找最小值             for(int j=0;j<N;j++){                if(vis[j]==0&&d[j]<min){                    min=d[j];                    v=j;                }            }            vis[v]=1;            res+=min;            //更新            for(int j=0;j<N;j++){                if(vis[j]==0&&dis[v][j]<d[j]){                    d[j]=dis[v][j];                }            }        }        printf("The highest possible quality is 1/%d.\n",res);    }    return 0;}

原创粉丝点击