给我们n座房子,房子的高度各不相同, 从最低的房子开始, 每次跳到更高的房子, 跳n-1次最能跳到最高的房子了,但是每次跳跃的距离不能超过d

将这些房子在一维的方向上重新摆放(但是保持输入时的相对位置不变) , 使得最矮的房子和最高的房子水平距离最大

将房子的坐标设为xi,  n个变量, 和2(n-1)个约束关系,  典型的差分约束系统

高度相近的两个坐标(设为xi,xj)相减  abs(xi-xj) <= d,   要想办法去掉绝对值, 那么规定一律id大的减去id小的,那么结果就是正的

又需要保持输入的相对位置不变, 那么 x(i+1) - x(i) >=1,   因为要化为最短路 所以是  x(i) - x(i+1) <= -1

所以按照上面的分析构造图,然后跑一边最短路即可。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <math.h>
using namespace std;
#pragma warning(disable:4996)
#pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
const int INF = 1 << 30;
/**/
const int N = 1000 + 10;
struct Node
{int id, height;bool operator <(const Node &rhs){return height < rhs.height;}
}a[N];
struct Edge
{int v, dist;Edge(){}Edge(int _v, int _dist) :v(_v), dist(_dist){}bool operator<(const Edge&rhs)const{return dist > rhs.dist;}
};
vector<Edge> g[N];
int dist[N];
bool vis[N];
int dij(int x, int y, int n)
{for (int i = 1; i <= n; ++i)dist[i] = INF;priority_queue<Edge> q;Edge cur, tmp;cur.dist = dist[x] = 0;cur.v = x;q.push(cur);while (!q.empty()){cur = q.top(); q.pop();int u = cur.v;if (dist[u] < cur.dist)//如果cur.dist < dist[u], 那么可以继续更新其他顶点, 代替了条件vis[u]continue;for (int i = 0; i < g[u].size(); ++i){int v = g[u][i].v;if (dist[v] > dist[u] + g[u][i].dist){tmp.dist = dist[v] = dist[u]+ g[u][i].dist;tmp.v = v;q.push(tmp);}}}return dist[y];
}int spfa(int x, int y, int n)
{for (int i = 1; i <= n; ++i)dist[i] = INF;queue<int> q;q.push(x);dist[x] = 0;while (!q.empty()){int u = q.front(); q.pop();vis[u] = false;for (int i = 0; i < g[u].size(); ++i){int v = g[u][i].v;if (dist[v] > dist[u] + g[u][i].dist){dist[v] = dist[u] + g[u][i].dist;//能更新就更新if (!vis[v])//如果结点在队里里面,就不用重复入队了
                {q.push(v);vis[v] = true;}}}}return dist[y];
}
int main()
{int n, d, t;scanf("%d", &t);for (int k = 1; k <= t; ++k){scanf("%d%d", &n, &d);for (int i = 1; i <= n; ++i)g[i].clear();for (int i = 1; i <= n; ++i){scanf("%d", &a[i].height);a[i].id = i;if (i != 1)g[i].push_back(Edge(i-1, -1));}sort(a + 1, a + n + 1);bool flag = true;for (int i = 2; i <= n; ++i){if (abs(a[i].id - a[i - 1].id) > d){flag = false;break;}g[min(a[i].id, a[i - 1].id)].push_back(Edge(max(a[i].id, a[i - 1].id), d));}printf("Case %d: ", k);if (!flag)puts("-1");else{if (a[1].id > a[n].id)swap(a[1].id, a[n].id);printf("%d\n", spfa(a[1].id, a[n].id,n));}}return 0;
}

用最短路求出解后, 其它点与源点的差值最大。

用最长路求出解后,其它点与源点的差值最小。

转载于:https://www.cnblogs.com/justPassBy/p/4646438.html

2010多校第一题 hdu3440House Man 差分约束系统相关推荐

  1. 2019年杭电多校第一场 1001题blank(DP)HDU6578

    2019年杭电多校第一场 1001题blank(DP)HDU6578 解决思路,开一个DP数组来存储0 1 2 3四个字符最后出现的位置,并且在DP中已经==排好序==. DP开四维,DP[i][j] ...

  2. 2021杭电多校补题——第一场

    2021杭电多校补题--第一场 文章目录 Mod, Or and Everything Rocket land(待补) Puzzle loop(待补) Another thief in a Shop( ...

  3. [转载]湘教版高中地理必修三:2011年五校第一学期高二

    [转载]湘教版高中地理必修三:2011年五校第一学期高二 2012年01月11日 2011年第一学期高二期末联考地理(初稿) 说明:本试卷分第一部分和第二部分.第一部分为选择题,第二部分为非选择题.考 ...

  4. 2019牛客多校第一场

    2019牛客多校第一场 题号 题目 知识点 A Monotonic Matrix B Symmetric Matrix C Fluorescent 2 D Two Graphs E Removal F ...

  5. 洛阳理工JAVA期末考试_洛阳理工学院2010/2011学年第一学期基础体育理论期末考试试题答案...

    洛阳理工学院2010/2011学年第一学期基础体育理论期末考试试题答案 洛阳理工学院2010/2011学年第一学期基础体育理论期末考试试题答案 一.填空题(每空1分 共20分) 1.以 ______ ...

  6. python字符串去重及排序 牛客_2018牛客多校第一场 D.Two Graphs

    题意: n个点,m1条边的图E1,n个点,m2条边的图E2.求图E2有多少子图跟图E1同构. 题解: 用STL的全排列函数next_permutation()枚举映射.对于每一种映射枚举每一条边判断合 ...

  7. 2020 牛客多校第一场

    2020 牛客多校第一场 A. B-Suffix Array 后缀数组的思想:倍增+桶排序的方式找出一串连续序列后缀的大小.虽说正常使用的时候都是字典序,但是只要修改排序方式,也能够达到一个类似的&q ...

  8. 搜狐2010校园招聘第一站北邮笔试题

    搜狐2010校园招聘第一站北邮笔试题 转自 狼窝 http://blog.csdn.net/haoxing168 转载请注明出处 一.填空选择题.(好像是20多分) 太多了,忘了,总之是基础的啦,有看 ...

  9. 搜狐2010校园招聘第一站北邮笔试题(转) 以及 本人做的部分答案

      搜狐2010 校园招聘第一站北邮笔试题  <script type="text/javascript"> </script> <script ty ...

  10. 四川大学线下编程比赛第一题:数字填充

    四川大学线下编程比赛第一题:数字填充 公布公司: 有 效 期: CSDN 2014-09-27至2015-09-26 难 度 等 级: 答 题 时 长: 编程语言要求: 120分钟 C C++ Jav ...

最新文章

  1. [C] zintrin.h: 智能引入intrinsic函数 V1.01版。改进对Mac OS X的支持,增加INTRIN_WORDSIZE宏...
  2. 离散对数(同余理论-BSGS算法)
  3. php 126怎么设置发送邮箱验证码,phpmailer发送网易126邮箱的例子
  4. Java SimpleTimeZone setStartRule()方法与示例
  5. Django登陆以后重定向到请求登陆的页面
  6. 阿里云轻量服务器使用
  7. Xshell 如何导入 PuTTYgen 生成的 key
  8. 九连环问题c语言程序,九连环游戏的算法源代码
  9. java微信公众号上传永久素材_微信开放平台永久素材视频文件上传
  10. 大豆技术面分析_期货分析是看技术面还是基本面?怎么进行期货分析
  11. Linux TF卡ext4文件系统录制视频文件用拷贝不用移动的影响
  12. (CodeForce) C. Edgy Trees (并查集)
  13. 公司内局域网访问接口
  14. 国家统计局2020年6月30日最新省/市/县三级json数据(不包含港澳台)
  15. 工业机器人 郝卫东_川崎焊接机器人控制系统设计开发
  16. 一些有意思的文章和资源
  17. 中国银联等方面可谓煞费苦心
  18. Microsoft Project 2010 简介
  19. Linux常用命令——rpmbuild命令
  20. 产品价值链与客户价值链

热门文章

  1. virtualbox centos安装增强工具
  2. Linux下C++的多线程编程
  3. Redis命令 - sortedSet
  4. spark性能调优:资源优化
  5. 如何优雅的统计代码耗时?
  6. 面试14种神回复,HR妹子可能会爱上你!
  7. 职场 PUA 你知多少?
  8. ofo 彻底凉凉。。。
  9. 从0开始学习 GitHub 系列之「向GitHub 提交代码」
  10. 程序员必备简捷开发辅助工具总结