POJ1789 Truck History

考查点:最小生成树
提交情况:2次RE
AC_Code:
  1. #include <iostream>
  2. using namespace std;
  3. bool visited[2001];
  4. int dis,mini,totaldistance,lowcost[2001];
  5. int cal_distance(char *a,char *b)
  6. {
  7.     dis=0;
  8.     for(int i=0;i<7;i++)
  9.         if(a[i]!=b[i])
  10.             dis++;
  11.     return dis;
  12. }
  13. int prim(int num,char types[][8])
  14. {
  15.     int v,temp=-1;
  16.     totaldistance=0;
  17.     visited[0]=true;
  18.     for(int i=0;i<num;i++)
  19.         lowcost[i]=cal_distance(types[0],types[i]);
  20.     for(int i=1;i<num;i++)
  21.     {
  22.         mini=100;
  23.         for(int j=0;j<num;j++)
  24.             if(visited[j]==false&&lowcost[j]<mini)
  25.             {
  26.                 mini=lowcost[j];
  27.                 v=j;
  28.             }
  29.             visited[v]=true;
  30.             totaldistance+=mini;
  31.             for(int j=0;j<num;j++)
  32.             {
  33.                 temp=cal_distance(types[v],types[j]);
  34.                 if(visited[j]==false&&temp<lowcost[j])
  35.                     lowcost[j]=temp;
  36.             }
  37.     }
  38.     return totaldistance;
  39. }
  40. int main()
  41. {
  42.     int num;
  43.     while (cin>>num)
  44.     {
  45.         if(num==0) break;
  46.         for(int i=0;i<num;i++)
  47.             visited[i]=false;
  48.         char types[2001][8];
  49.         for(int i=0;i<num;i++)
  50.                 cin>>types[i];
  51.         cout<<"The highest possible quality is 1/"<<prim(num,types)<<"."<<endl;
  52.     }
  53.     return 0;
  54. }
小感:
还是最小生成树的问题。可能题目不太好懂,就是每个车有一个7位的编码,把每两个车编码中对应位字母不同的个数叫做这两个编码的长度。因为quality=1/sum(t 0,t d),所以只要找到所有编码的继承关系使得形成的树的权值最小即可,即最小生成树。
RE了两次,开始以为是不是数组的大小没设置好,于是把7改成了该成了8,结果还是RE了。后来发现说变量v没有初始化,一下子发现是visited在使用完一次后没有重新赋值~粗心啊~本来还想到的~没有用scanf,不知道会不会快一点~最后的时间好像是500多MS~
还有,就是动态二维数组的申请,开始是这么想的,可是太菜了,不太会~别笑~嘿嘿~char types[][]不能赋给char **.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值