POJ 1789 -- Truck History(Prim)

 POJ 1789 -- Truck History

 Prim求分母的最小。即求最小生成树

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn = 2000 + 10;
 6 const int INF = 1000000;
 7 int n;//有几个卡车 
 8 char str[maxn][10];
 9 int d[maxn];//记录编号的数值
10 int Edge[maxn][maxn];
11 int dist[maxn];
12 void prim()
13 {
14     int sum=0;
15     //加入源点
16      dist[0] = -1;
17     for(int i=1;i<n;i++)
18     {
19         dist[i] = Edge[0][i];
20     }
21     
22     for(int i=1;i<n;i++)//依次加入n-1条边
23     {
24         int min = INF,pos;
25         for(int j=1;j<n;j++)//找出最小的一条 
26         {
27             if(min>dist[j] && dist[j]!=-1)
28             {
29                 min = dist[j];pos = j;
30             }
31         }
32         //将pos加入
33          dist[pos] = -1;sum+=min;
34          //进行路径的更新
35          for(int k=1;k<n;k++)
36          {
37              if(dist[k] > Edge[pos][k])
38                  dist[k]=Edge[pos][k];
39           } 
40      } 
41      cout<<"The highest possible quality is 1/"<<sum<<"."<<endl;
42 }
43 
44 int main()
45 {
46     while(cin>>n && n)
47     {
48         for(int i=0;i<n;i++)
49         {
50             cin>>str[i];
51          } 
52          for(int i=0;i<n;i++)
53          {
54              int num=0;
55              for(int k=0;k<7;k++)
56                  num += (int)(str[i][k] - 'a');
57             d[i] = num; 
58          }
59          memset(Edge,0,sizeof(Edge));
60          for(int i=0;i<n;i++)
61          {
62              for(int j=i+1;j<n;j++)
63              {
64                      int temp = 0;
65                      for(int k=0;k<7;k++)
66                      {
67                          temp += str[i][k]!=str[j][k];
68                      }
69                      Edge[i][j] = Edge[j][i] = temp;
70              }
71          }
72          memset(dist,INF,sizeof(dist));
73          prim();
74          
75     }
76     
77      
78     return 0;
79 }

 

 

转载于:https://www.cnblogs.com/yxh-amysear/p/8592010.html

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值