• 【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
    ", dif, ans);
    104     }
    105 
    106     return 0;
    107 }
  • 相关阅读:
    输入输出缓冲流(注册登录实现)
    BufferedWriter
    vue2饿了吗之路第一篇:开发环境准备
    Vue之生命周期
    CSS之Flex布局
    Python爬虫之路第二篇:实战
    python爬虫之路第一篇:入门
    python之字典Dict
    python之元祖tuple
    python之列表list
  • 原文地址:https://www.cnblogs.com/bombe1013/p/3859326.html
Copyright © 2020-2023  润新知