poj 1789 Truck History(最小生成树 prim)

题目:http://poj.org/problem?id=1789

大意:每个卡车都有自己的编号,由七位字母组成

d(to,td) is the distance of the types指t0 和 td卡车编号字母不同的个数,即点t0和点td的权

最好得衍生方案是是的总权值最小,即最小生成树

用的prim

View Code
#include <iostream>
#include<cstdio>
#include<cstring>
#define inf 0x7fffffff
using namespace std;
char str[2005][7];
int map[2005][2005];
int n;
int cmp(char *s1,char *s2)
{
    int i,num=0;
    for(i=0;i<7;i++)
    {
        if(*(s1+i)!=*(s2+i))
        num++;
    }
    return num;
}
void prim()
{
    int vis[2005];
    int dis[2005];
    int i,j;
    memset(vis,0,sizeof(vis));
    vis[0]=1;
    for(i=1;i<n;i++)
    {
        dis[i]=map[0][i];
    }
    int min;
    int pos;
    int ans=0;
    for(i=0;i<n;i++)
    {
        min=inf;
        for(j=0;j<n;j++)
        {
            if(min>dis[j]&&!vis[j])
            {
                pos=j;
                min=dis[j];
            }
        }
        if(min==inf)
        break;
        ans+=min;
        vis[pos]=1;
        for(j=0;j<n;j++)
        {
            if(map[pos][j]<dis[j]&&!vis[j]&&map[pos][j]>0)
            {
                dis[j]=map[pos][j];
            }
        }
    }
    printf("The highest possible quality is 1/%d.\n",ans);
}
int main()
{
    int i,j;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
        break;
        getchar();
        for(i=0;i<n;i++)
        {
            gets(str[i]);
        }
        memset(map,0,sizeof(map));
        for(i=0;i<n-1;i++)
        {
            for(j=i+1;j<n;j++)
            {
                map[i][j]=cmp(str[i],str[j]);
                map[j][i]=map[i][j];
            }
        }
        prim();
    }
    return 0;
}

 

 

posted @ 2012-12-03 20:46  琳&leen  阅读(129)  评论(0编辑  收藏  举报