1062 昂贵的聘礼 解题报告

AccecptTime:  2009-01-04 17:12:21
Language: C++
Memory:  296K
Time:  0MS
Errors:  3WA
Algorithm: Dijkstra最短路径

  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <memory.h>
  4. #include <algorithm>
  5. #define INFINITY 999999999
  6. using namespace std;
  7. int minLevel,m;
  8. int price[101];
  9. int l[101];
  10. int levelSort[101];
  11. int road[101][101];
  12. int d[101];
  13. //酋长不一定是等级最高的
  14. //这题比较麻烦的是等级的判断,这里用minLevel和m来枚举每种等级范围
  15. //Dijkstra最短路径
  16. void ShortestPath_DIJ(int n) 
  17. {
  18.     bool final[101];
  19.     int min,v;
  20.     memset(final,0,sizeof(bool) * 101);
  21.     for(int i = 1; i <= n; i++)
  22.         d[i] = road[1][i];
  23.     final[1] = true;
  24.     for(int i = 1; i <= n; i++) {
  25.         min = INFINITY;
  26.         v = 0;
  27.         for(int w = 2; w <= n;w++)
  28.             if(!final[w] && (l[w] >= minLevel) &&(l[w] - m <= minLevel) && d[w] < min) {
  29.                 min = d[w];
  30.                 v = w;
  31.             }
  32.         if(!v)
  33.             break;
  34.         final[v] = true;
  35.         forint w = 1 ; w <= n; w++)
  36.             if(!final[w] && (l[w] >= minLevel) &&(l[w] - m <= minLevel) && (d[v] + road[v][w] < d[w]))
  37.                 d[w] = d[v] + road[v][w];
  38.     }
  39. }               
  40. int main()
  41. {
  42.     int n,k,o;
  43.     cin >> m >> n;
  44.     for(int i =1 ;i <= n; i++)
  45.         for(int j = 1; j <= n; j++)
  46.             road[i][j] = INFINITY;
  47.     road[1][1] = 0;
  48.     for(int i = 1; i <= n; i++) {
  49.         cin >> price[i] >> l[i] >> k;
  50.         levelSort[i] = l[i];
  51.         for(int j = 1; j <= k ; j++) {
  52.             cin >> o ;
  53.             cin >> road[i][o];
  54.         }
  55.     }
  56.     int low=INFINITY;
  57.     //对可能level进行排序
  58.     sort(levelSort+1,levelSort+n+1);
  59.     for(int i = 1; i < n; i++) {
  60.         minLevel = levelSort[i];
  61.         if(minLevel + m < l[1])
  62.             continue;
  63.         if(minLevel > l[1])
  64.             break;
  65.         ShortestPath_DIJ(n);
  66.         for(int i = 1 ; i <= n; i++) 
  67.             if( (l[i] >= minLevel) &&(l[i] - m <= minLevel) && (d[i] + price[i] < low))
  68.                 low = d[i] + price[i];
  69. //这里交的时候错了,但是似乎poj的数据太弱了,还可以ac
  70. // if(minLevel + m >= levelSort[n-1]) 因为是以1为头元素下标所以这应该是n
  71. //感谢波哥的数据~
  72.         if(minLevel + m >= levelSort[n])
  73.             break;
  74.     }
  75.     printf("%d/n",low);
  76.     return 0;
  77. }
这题比较麻烦的是等级的处理,其余的就是一道朴素的Dijkstra了。

好久没写题了,感觉有点不适应了...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值