【HDOJ】2363 Cycling

二分+Dijkstra。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <queue>
  6 using namespace std;
  7 
  8 #define MAXN 105
  9 #define INF  1000001
 10 
 11 int n, m;
 12 int map[MAXN][MAXN], al[MAXN], bk[MAXN], path[MAXN];
 13 bool visit[MAXN];
 14 int low, high;
 15 int ans, dif;
 16 
 17 int dijkstra() {
 18     int i, j, v, min;
 19 
 20     if (al[1]<low || al[1]>high)
 21         return INF;
 22 
 23     memset(visit, false, sizeof(visit));
 24     visit[1] = true;
 25     for (i=1; i<=n; ++i) {
 26         if (al[i]>=low && al[i]<=high)
 27             path[i] = map[1][i];
 28         else
 29             path[i] = INF;
 30     }
 31 
 32     for (i=1; i<n; ++i) {
 33         min = INF;
 34         for (j=1; j<=n; ++j) {
 35             if (!visit[j] && path[j]<min) {
 36                 v = j;
 37                 min = path[j];
 38             }
 39         }
 40         if (min == INF)
 41             break;
 42         visit[v] = true;
 43         for (j=1; j<=n; ++j) {
 44             if (!visit[j] && map[v][j]+min<path[j] && al[j]>=low && al[j]<=high)
 45                 path[j] = map[v][j] + min;
 46         }
 47     }
 48     return path[n];
 49 }
 50 
 51 int main() {
 52     int t, min, l, r, max, mid;
 53     int i, j, k, tmp;
 54 
 55     scanf("%d", &t);
 56     while (t--) {
 57         scanf("%d %d", &n, &m);
 58         min = dif = 1000000001;
 59         ans = INF;
 60         max = 0;
 61         for (i=1; i<=n; ++i) {
 62             scanf("%d", &al[i]);
 63             if (al[i] < min) min = al[i];
 64             if (al[i] > max) max = al[i];
 65             bk[i] = al[i];
 66         }
 67         for (i=1; i<=n; ++i) {
 68             map[i][i] = 0;
 69             for (j=i+1; j<=n; ++j)
 70                 map[i][j] = map[j][i] = INF;
 71         }
 72         while (m--) {
 73             scanf("%d %d %d", &i, &j, &k);
 74             if (map[i][j] > k)
 75                 map[i][j] = map[j][i] = k;
 76         }
 77         sort(bk+1, bk+1+n);
 78         l = 0; r = max-min+1;
 79         while (l < r) {
 80             mid = (l + r)>>1;
 81             bool flag = false;
 82             for (i=1; i<=n; ++i) {
 83                 low = bk[i];
 84                 high = bk[i] + mid;
 85                 tmp = dijkstra();
 86                 if (tmp != INF) {
 87                     flag = true;
 88                     break;
 89                 }
 90             }
 91             if ( flag ) {
 92                 if (mid < dif) {
 93                     dif = mid;
 94                     ans = tmp;
 95                 } else if (mid==dif && ans > tmp) {
 96                     ans = tmp;
 97                 }
 98                 r = mid;
 99             } else {
100                 l = mid + 1;
101             }
102         }
103         printf("%d %d\n", dif, ans);
104     }
105 
106     return 0;
107 }

转载于:https://www.cnblogs.com/bombe1013/p/3859326.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值