Truck History POJ 1789 ZOJ 2158 Prim算法
就是Prim算法,求最小生成树,把每个汽车编号看成点,两个编号的距离,也就是相同位置不同字符的数目,就看做边,显然,看成无向图,谁生成谁自己想想就行了 ,这里边比较多,用Prim算法。
代码:
View Code
1 #include <cstdio> 2 #define MAXN 2005 3 int n; 4 int lowcost[MAXN]; 5 int edge[MAXN][MAXN]; 6 int dis(char a[],char b[]) 7 { 8 int s = 0; 9 for(int i=0; i<7; i++) 10 if(a[i] != b[i] ) s++; 11 return s; 12 } 13 void Prim() 14 { 15 int i,j; 16 int sum=0; 17 for(i=0; i<n; i++) 18 lowcost[i] = edge[0][i]; 19 lowcost[0] = -1; 20 for(i=1; i<n; i++) 21 { 22 int min= 1000000; 23 int v; 24 for(j=0; j<n; j++) 25 { 26 if(lowcost[j] != -1 && lowcost[j] <min) 27 { 28 v = j; 29 min = lowcost[j]; 30 } 31 } 32 sum += lowcost[v]; 33 lowcost[v] = -1; 34 for(j=0; j<n; j++) 35 { 36 if(lowcost[j] != -1 && edge[v][j] < lowcost[j]) 37 lowcost[j] = edge[v][j]; 38 } 39 } 40 printf("The highest possible quality is 1/%d.\n",sum); 41 } 42 int main() 43 { 44 // freopen("out.cpp","r",stdin); 45 while(~scanf("%d",&n) && n != 0) 46 { 47 int i,j; 48 char a[MAXN][8]; 49 for(i=0; i<n; i++) 50 scanf("%s",a[i]); 51 for(i=0; i<n; i++) 52 { 53 for(j =i; j<n; j++) 54 { 55 if(i == j ) edge[i][j] = 0; 56 else 57 { 58 edge[i][j] = dis(a[i],a[j]); 59 edge[j][i] = edge[i][j]; 60 } 61 } 62 } 63 Prim(); 64 } 65 return 0; 66 }
这题很成功地过了。