spfa+差分约束系统(C - House Man HDU - 3440 )+对差分约束系统的初步理解
题目链接:https://cn.vjudge.net/contest/276233#problem/C
题目大意:有n层楼,给你每个楼的高度,和这个人单次的最大跳跃距离m,两个楼之间的距离最小是1,但是楼和楼之间的距离是能够调整的,现在有一个人,要从最矮的楼开始跳,每一次跳到比当前的楼高的楼上,然后问你在将所有的楼都走一遍的基础上,从第一个楼到最后一个楼之间的最远距离是多少?
思路:使用差分约束系统的相关知识, 我们可以建立如下不等式。
1,当相邻的时候,限制posA-posB>=1,也就是posB-posA<=-1。
2,当按照高度依次建立边的时候,我们就限制posA-posB<=m。这样的根据这两个式子就可以建立图了。
注意点:我们在建立相邻点的时候,是按照从小到大进行建边的,所以在对于第二种情况的时候,我们应该是先判断两个位置的大小,再去建边。
对差分约束系统的初步理解:如果是和spfa有关的话,具体就是建立不等式,然后如果求最大差值的话,我们直接将变建立成这两个点的最大差值就可以了。然后在跑最短路的过程中,就是找满足从posA到posB的所有不等式当中的最小的哪一个,因为求出来的值是要满足这两个点的所有不等式的。
AC代码:
#include<iostream>
#include<cstring>
#include<stack>
#include<iomanip>
#include<cmath>
#include<queue>
#include<algorithm>
#include<stdio.h>
using namespace std;
# define ll long long
# define inf 1ll<<
const int maxn = +;
const int maxedge= +;
int n;
ll m;
int num,head[maxn];
ll dis[maxn];
int out[maxn],vis[maxn];
struct node
{
int fr;
int to;
ll cost;
int nex;
} edge[maxedge];
struct point
{
int num;
int id;
} po[maxn];
bool cmp(point t1,point t2)
{
return t1.num<t2.num;
}
void init()
{
for(int i=; i<=n; i++)
{
head[i]=-;
out[i]=;
vis[i]=;
dis[i]=inf;
}
num=;
}
void addedge(int fr,int to,ll cost)
{
edge[num].to=to;
edge[num].cost=cost;
edge[num].nex=head[fr];
head[fr]=num++;
}
ll spfa(int st,int ed)
{
dis[st]=;
vis[st]=;
queue<int>q;
q.push(st);
while(!q.empty())
{
int tmp=q.front();
q.pop();
vis[tmp]=;
out[tmp]++;
if(out[tmp]>n)
return -;
for(int i=head[tmp]; i!=-; i=edge[i].nex)
{
int u=edge[i].to;
if(dis[u]>dis[tmp]+edge[i].cost)
{
dis[u]=dis[tmp]+edge[i].cost;
if(vis[u])
continue;
vis[u]=;
q.push(u);
}
}
}
return dis[ed];
}
int main()
{
int T;
scanf("%d",&T);
int Case=;
while(T--)
{
scanf("%d %lld",&n,&m);
init();
for(int i=; i<=n; i++)
{
scanf("%d",&po[i].num);
po[i].id=i;
}
for(int i=; i<n; i++)
{
addedge(i+,i,-);
}
sort(po+,po+n+,cmp);
for(int i=; i<n; i++)
{
int u=po[i+].id;
int v=po[i].id;
if(u>v)
swap(u,v);
addedge(u,v,m);
}
int t1=po[].id;
int t2=po[n].id;
if(t1>t2)
swap(t1,t2);
ll ans=spfa(t1,t2);
printf("Case %d: %lld\n",++Case,ans);
}
return ;
}
spfa+差分约束系统(C - House Man HDU - 3440 )+对差分约束系统的初步理解的更多相关文章
- POJ 1364 / HDU 3666 【差分约束-SPFA】
POJ 1364 题解:最短路式子:d[v]<=d[u]+w 式子1:sum[a+b+1]−sum[a]>c — sum[a]<=sum[a+b+1]−c−1 ...
- HDU 3440 House Man(编号排序+线性差分约束跑最短路)
House Man Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- hdu 3440(差分约束好题)
House Man Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- hdu 3440 差分约束
看完题目第一遍,感觉很简单.当写完程序跑测试用例的时候,发现第二个总是过不了,然后好好研究了一下测试用例,才知道原来不是程序有问题,而是我的建图方式错了.对于这些无序的点,如果高的在右边,不等式是di ...
- hdu 3440 House Man
差分约束系统 例如, 5 6 20 34 54 10 15 这一组测试数据 先编号,分别为1 2 3 4 5 ,然后可以写出一组表达式,两个编号之间的距离必定大于等于1的,所以i+1到i建立有向边 ...
- hdu 1384 Intervals (差分约束)
/* 给你 n 个区间 [Ai, Bi],要求从每一个区间中至少选出 Ci 个数出来组成一个序列 问:满足上面条件的序列的最短长度是多少? 则对于 不等式 f(b)-f(a)>=c,建立 一条 ...
- POJ 3169 Layout (HDU 3592) 差分约束
http://poj.org/problem?id=3169 http://acm.hdu.edu.cn/showproblem.php?pid=3592 题目大意: 一些母牛按序号排成一条直线.有两 ...
- hdu 1384 Intervals (差分约束)
Intervals Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- Hdu 1384(差分约束)
题目链接 Intervals Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
随机推荐
- 如何从 GitHub 上下载单个文件夹?
比如别人把一些资料传到 GitHub 上做分类归档,我怎么才能下载单一分类文件夹? 点击 Raw ,如果是不能预览的文件就会自动下载,如果是文件或者代码什么的,会在浏览器中显示,但可以复制浏览器中链接 ...
- IE显示对象不支持此属性或方法 的解决方法
用C# 编写的ActiveX控件, 调试时,在世界之窗浏览器里能正确显示,但是不能和JS交互,也没有传说中的错误信息框出现,查了很多文档,后来想问题是不是出在浏览器上,换在IE8里调试,点击交互按钮, ...
- 图片上传预览,兼容IE
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ibatis解决sql注入问题
原文: http://blog.csdn.net/scorpio3k/article/details/7610973 对于ibaits参数引用可以使用#和$两种写法,其中#写法会采用预编译方式,将转义 ...
- MT【150】源自斐波那契数列
(清华2017.4.29标准学术能力测试7) 已知数列$\{x_n\}$,其中$x_1=a$,$x_2=b$,$x_{n+1}=x_n+x_{n-1}$($a,b$是正整数),若$2008$为数列中的 ...
- debian安装filebeat5.5收集nginx日志
先贴一下我的BELK架构 1.Download and install the Public Signing Key: # wget -qO - https://artifacts.elastic.c ...
- Google Gson用法
the latest version is 2.8.0. If you're using Gradle, add the following line: compile 'com.google.cod ...
- 【学习笔记】BEST定理
害怕忘记简单写一点: 无向图的生成树计数:https://www.cnblogs.com/zj75211/p/8039443.html (*ZJ学长 ORZ ) 有向图的欧拉回路计数:https: ...
- 一、linux学习之centOS系统安装(VMware下安装)
一.下载 这个真的没有什么技术含量,也不附下载连接了.这里需要说明的是,其实在VMware下安装centOS是非常简单的,但是这里我要纪录的是在PC上安装centOS,之所以跟标题有出入是因为为了纪录 ...
- python的str()字符串类型的方法详解
字符串一旦创建,不可修改,一旦修改或者拼接,都会造成重新生成字符串,因为内存存数据是一个挨着一个存的,如果增加一个字符串的话,之前的老位置只有一个地方,不够,这是原理性的东西,在其他语言里面也一样 7 ...