Poj 1789 Truck History

题目大意:给出一个n*7的字母矩阵,每一行代表一种车,那么定义的每种车之间的距离为七个位置上每个相应的位置上不同字母数的和。

思路:利用Prim算法求最小生成树,找出最小的距离和。

#include <stdio.h>
#include <string.h>
int data[2010][2010];
int n;
char str[2010][10];
//找出第i行和第j行中不同字母数的和
int get_diff(int i,int j) {
	int num,ctr;
	num=0;
	for ( ctr=0;ctr<7;ctr++ ) {
		if ( str[i][ctr]!=str[j][ctr] )
			num++;
	}
	return num;
}
/* Prim算法,返回生成树中各条边的权值的和*/
int prim() {
	int ctr,po,mi,sum;
	int i,j,k;
	ctr=0;
	sum=0;
	while ( ctr<n-1 ) {
		mi=65537;
		for ( i=1;i<n;i++ ) {
			if (data[0][i]<mi) {
				po=i;
				mi=data[0][i];
			}
		}
		sum=sum+mi;
		ctr++;
		for ( i=1;i<n;i++ ) {
			if (data[po][i]<data[0][i])
				data[0][i]=data[po][i];
			if (data[i][po]<data[i][0]) 
				data[i][0]=data[i][po];
			data[i][po]=65537;
			data[po][i]=65537;
		}
		data[0][po]=65537;
	}
	return sum;
}
int main()
{
	int i,j,k;

	scanf("%d",&n);
	while ( n!=0 ) {
		for ( i=0;i<n;i++ ) 
			scanf("%s",&str[i] );
	
		for ( i=0;i<n;i++ ) {
			for ( j=0;j<n;j++ ) {
				data[i][j]=get_diff(i,j);
			}
		}
		k=prim();
		printf("The highest possible quality is 1/%d.\n",k);
		scanf("%d",&n);
	}
	return 0;
}



你可能感兴趣的:(Poj 1789 Truck History)