链接:
http://poj.org/problem?id=1789
题意: 这个题的题意看英文那真的怎么也看不懂啊。哎,只能说英文水准还不够啊。关键的一句:They defined the distance of truck types as the number of positions with different letters in truck type codes. (看不懂这句,这题就没法做。)关键意思是说:distance定义为两个卡车code之间每个相同位置letter不同的个数。例如:aaaaaaa和abcdefg的distance为6。懂了这个题目就好做了。题目本身很简单。
用prim就可以过了,适合像我这样的新手入门。最好再把kruskal的写一遍。这样就好了。
浅谈:略。
题意: 这个题的题意看英文那真的怎么也看不懂啊。哎,只能说英文水准还不够啊。关键的一句:They defined the distance of truck types as the number of positions with different letters in truck type codes. (看不懂这句,这题就没法做。)关键意思是说:distance定义为两个卡车code之间每个相同位置letter不同的个数。例如:aaaaaaa和abcdefg的distance为6。懂了这个题目就好做了。题目本身很简单。
用prim就可以过了,适合像我这样的新手入门。最好再把kruskal的写一遍。这样就好了。
浅谈:略。
#include<iostream>
#include<cstring>
#define MAX 2010
#define MAXdis 10
using namespace std;
struct truck
{
char code[8];
};
truck tr[MAX];
int lowcost[MAX];
int closest[MAX];
int N;
int check(int m,int n)
{
if(m==n)return 0;
int i,differ=0;
for(i=0;i<7;i++)
if(tr[m].code[i]!=tr[n].code[i])
differ++;
return differ;
}
int Prim()
{
int i,j,mindis,minone;
int ans=0;
for(i=1;i<=N;i++)
{
lowcost[i]=check(1,i);
closest[i]=1;
}
for(i=0;i<N-1;i++)
{
mindis=MAXdis;
for(j=1;j<=N;j++)
if(lowcost[j]&&mindis>lowcost[j])
{
mindis=lowcost[j];
minone=j;
}
ans+=lowcost[minone];
lowcost[minone]=0;
for(j=1;j<=N;j++)
{
int differ=check(j,minone);
if(differ<lowcost[j])
{
lowcost[j]=differ;
closest[j]=minone;
}
}
}
return ans;
}
int main()
{
int n,i;
char code[8];
while(cin>>n&&n)
{
N=n;
for(i=1;i<=n;i++)
{
cin>>code;
strcpy(tr[i].code,code);
}
cout<<"The highest possible quality is 1/"<<Prim();
cout<<"."<<endl;
}
return 0;
}