1789 Truck History 解题报告

 本来以为对最小生成树的学习告一段落了,昨晚跟波波聊的时候他说Prim不一定比Kruskal慢,于是我就拿1789来开刀。果然,于是我先用Kruskal,ac,1641MS,恩,不错.再用Prim写,一交,果然TimeLimitExeeded!!看来波波错了,但是他是已经ac了的..看看他的时间,只有375MS,不算cin的时间消耗他的程序比我快了足足3倍!!看他的解题报告,原来他用的储存结构和我的不一样..换他的那种方法试试,ac,282MS.orz,幸好有他提醒,不然我就用Kruskal一辈子了...现在把1789贴出来,等会儿再刷几道最小生成树的~

 

AccecptTime:              2008-12-22 10:30:23
Language:                    C++
Memory:                     15624K
Time:                          282MS
Errors:                        2 TL
Algorithm:                  Prim

  1. #include <stdio.h>
  2. #include <memory.h>
  3. #include <algorithm>
  4. #include <iostream>
  5. using namespace std;
  6. // 最大值
  7. #define INF 99999999
  8. // 最多的边数
  9. #define N 2000
  10. // 路径储存
  11. int road[N][N];
  12. char type[N][8];
  13. int main()
  14. {
  15.     int n,m,count;
  16.     int i,j,k,l;
  17.     int mink,min,res;
  18.     while(true) {
  19.         scanf("%d",&n);
  20.         if(!n)
  21.             break;
  22. // 以下是将字符串转换为邻接矩阵
  23.         getchar();
  24.         for(i = 0; i < n; i++)
  25.             gets(type[i]);
  26.         for(i = 0; i < n; i++) {
  27.             road[i][i] = -1;
  28.             for(j = i + 1; j < n;j++) {
  29.                 count = 0;
  30.                 for(k = 0; k < 7; k++)
  31.                     if(type[i][k] != type[j][k])
  32.                         count++;
  33.                 road[i][j] = road[j][i] = count;
  34.             }
  35.         }
  36. //Prim最小生成树
  37.         res = 0;
  38.         int lesscost[N];
  39.         for(i = 0; i < n;i++)
  40.             lesscost[i] = road[0][i];
  41.         for( i = 1; i < n ;i++) {
  42.             min = INF;
  43.             for(j = 0; j < n; j++)
  44.                 if(lesscost[j] >= 0 && lesscost[j] < min) {
  45.                     min = lesscost[j];
  46.                     mink = j;
  47.                 }
  48.             res += min;
  49. // 将刚加入集合的节点的所有边和现有边做一个比较,保留小的边
  50.             for(j = 0; j < n;j++)
  51.                 if(lesscost[j] > road[mink][j])
  52.                     lesscost[j] = road[mink][j];
  53.         }
  54.         printf("The highest possible quality is 1/%d./n",res);
  55.     }
  56. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值