zoukankan      html  css  js  c++  java
  • 【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 }
  • 相关阅读:
    Linux系统下公式编辑器KLatexFormula
    C++11 std::chrono库详解
    Direct Visual-Inertial Odometry with Stereo Cameras
    改变机器人的初始位姿,让机器人的初始位置不在地图的原点处
    ubuntu为文件添加可执行权限
    oracle的启动和停用
    orcale创建用户、授权
    手工配置oracle数据库
    MySQL存储过程详解 mysql 存储过程
    mysql的navicat执行存储过程
  • 原文地址:https://www.cnblogs.com/bombe1013/p/3859326.html
Copyright © 2011-2022 走看看