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/archive/2013/03/31/2992314.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值