poj 1789 Truck History(最小生成树)

模板题

题目:http://poj.org/problem?id=1789

题意:有n个型号,每个型号有7个字母代表其型号,每个型号之间的差异是他们字符串中对应字母不同的个数d[ta,tb]代表a,b之间的差异数
问1/Σ(to,td)d(to,td)最大值

prime:

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<stack>
 6 #include<queue>
 7 #include<cmath>
 8 #include<algorithm>
 9 using namespace std;
10 
11 int grah[2100][2100];
12 int sum=0;
13 void pim(int n)
14 {
15     int i,j,pos;
16     int min,v[2100]= {0},d[2100];
17     for(i=1; i<=n; i++)
18         d[i]=grah[1][i];
19     v[1]=1;
20     for(i=2; i<=n; i++)
21     {
22         min=99999999;
23         for(j=1; j<=n; j++)
24         {
25             if(!v[j]&&min>d[j])
26             {
27                 min=d[j];
28                 pos=j;
29             }
30         }
31         sum+=min;
32         v[pos]=1;
33         for(j=1; j<=n; j++)
34         {
35             if(!v[j])
36             {
37                 if(d[j]>grah[pos][j])
38                     d[j]=grah[pos][j];
39             }
40         }
41     }
42 
43 }
44 int main()
45 {
46     int n,i,j,k,cou;
47     char s[2100][80];
48     while(cin>>n&&n)
49     {
50         getchar();
51         for(i=1; i<=n; i++)
52             cin>>s[i];
53         for(i=1; i<=n; i++)
54         {
55             for(j=i+1; j<=n; j++)
56             {
57                 cou=0;
58                 for(k=0; k<7; k++)
59                 {
60                     if(s[i][k]!=s[j][k])//如果有一个字母不同就+1
61                         cou++;
62                 }
63                 grah[i][j]=grah[j][i]=cou;
64             }
65             grah[i][i]=0;
66         }
67         pim(n);
68         printf("The highest possible quality is 1/%d.\n",sum);
69         sum=0;
70     }
71     return 0;
72 }

 

 

posted @ 2013-08-03 09:31  水门  阅读(184)  评论(0编辑  收藏  举报