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 }

这题很成功地过了。

原文地址:https://www.cnblogs.com/allh123/p/2992314.html