您的位置:首页 > 其它

POJ 1789 Truck History

2013-09-01 22:11 351 查看
题目:
输入T组数据,每组数据由7个小写字母组成,代表着一种卡车的编号,当T==0时,结束程序。
其实就是每组数据相当于一个顶点,每两个顶点之间的边的权值就是这两组数组的字母不同的个数。
如(1)aaaaaaaa、(2)baaaaaa;那么1-->2和2-->1的权值就为1。
题目是要你找出一棵树,使得这颗树的权值最小,计算出权值Q。
输出:The highest possible quality is 1/Q.
分析:最小生成树问题,Prim。。

//15592K	344MS
#include <stdio.h>
#define N 2001
#define MAX 8
#define bool char
#define true 1
#define false 0
char str
[8] ;
bool flag
;
int low_dis
;        //用low_dis数组存贮当前点s到其它点(不包括已经在最小生成树中的)的权值
int dis_betw

;            //存储i,j两点间的权值

int
Weight ( int const i , int const j )
{
int count ;
count = 0 ;
int k ;
for ( k = 0 ; k < 7 ; k ++ )
{
if ( str[i][k] != str[j][k] )
{
count ++ ;
}
}
return count ;
}

void
Init_Arrays ( int a[] , int num )
{
int i ;
for ( i = 0 ; i < N ; i ++ )
{
a[i] = num ;
}
}

void Init_Flag ( )
{
int i ;
for ( i = 0 ; i < N ; i ++ )
{
flag[i] = 0 ;
}
}

int Prim ( int const n )
{
Init_Flag  ( ) ;
Init_Arrays ( low_dis , MAX ) ;
int s ;
s = 1 ;
int m ;
m = 1 ;
int new_weight ;
int new_point ;
int prim_weight ;
prim_weight = 0 ;
while ( m < n )
{
new_weight = MAX ;
int i ;
for ( i = 2 ; i <= n ; i ++ )
{
if ( 0 == flag[i] && low_dis[i] > dis_betw[s][i] )
{
low_dis[i] = dis_betw[s][i] ;
}
if ( 0 == flag[i] && new_weight > low_dis[i] )
{
new_weight = low_dis[i] ;
new_point = i ;
}
}
s = new_point ;
flag[s] = 1 ;
prim_weight += new_weight ;
m ++ ;

}
return prim_weight ;
}

int
main ( )
{
int n ;
while ( EOF != scanf ("%d" , & n ) )
{
if ( 0 == n )
{
break ;
}
int i ;
for ( i = 1 ; i <= n ; i ++ )
{
scanf ("%s" , str[i] ) ;
}
for ( i = 1 ; i <= n - 1 ; i ++ )
{
int j ;
for ( j = i + 1 ; j <= n ; j ++ )
{
dis_betw[i][j] = dis_betw[j][i] = Weight ( i , j ) ;
}
}
printf ("The highest possible quality is 1/%d.\n" , Prim(n) ) ;
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: