I - 动物狂想曲 HDU - 6252(差分约束)
I - 动物狂想曲 HDU - 6252
雷格西桑和路易桑是好朋友,在同一家公司工作。他们总是一起乘地铁去上班。他们的路线上有N个地铁站,编号从1到N。1站是他们的家,N站是公司。
有一天,雷格西桑起床晚了。当他来到车站时,路易桑已经离开X分钟了。雷格西桑非常着急,于是他开始和路易桑聊天,交流他们的位置。内容是雷格西桑在A站和B站之间,路易桑在C站和D站之间。
B等于A+ 1这意味着雷格西在A站和A+1之间,
或B等于A这意味着雷格西就是在车站A,反之亦然对于C和D同理.更重要的是,他们交流的时间不能早于雷格西桑的离开,也不能晚于路易桑的到来。
到达公司后,雷格西桑想知道相邻地铁站之间的间隔时间。请注意,每个站点的停止时间都被忽略了Input
输入的第一行给出了测试用例的数量T.接下来是T组测试用例。每组测试用例以一行开始,由3个整数N、M和X组成,表示站点的数量、聊天内容的数量和雷格西桑与路易桑之间的分钟间隔。接下来是M行,每一行由4个整数A、B、C、D组成,表示每个聊天内容。
1≤T≤30 1≤N,M≤2000 1≤X≤109 1≤A,B,C,D≤N A≤B≤A+1 C≤D≤C+1Output 对于每个测试用例,输出一行包含“case #x:
y”,其中x是测试用例编号(从1开始),y是格式为t1、t2、…、tN−1的站与站之间的分钟数。ti表示i站和i+1站之间的分钟数,若有多租解,输出其中一个满足0<ti≤2×109.如果没有解决方案,则输出“IMPOSSIBLE”。
Sample Input
2
4 3 2
1 1 2 3
2 3 2 3
2 3 3 4
4 2 2
1 2 3 4
2 3 2 3
Sample Output
Case #1: 1 3 1
Case #2: IMPOSSIBLE
思路
题意:两个人乘一个由n站的地铁出发去公司,出发点为s = 1, 终点e = 2, 第一个人先出发k分钟,之后另一个人在出发(这里我们应该默认当它们都坐上地铁以后们的相对距离差是不会在改变的,
他们之间所差的时间也是不变的,始终是k
),在这个期间它们进行了m次交流,每次交流包含 a、b、c、d ,4个站点,其中a、b表示第2个人为与a -b 站之间,若果a == b,那么第二人正好在 a或b站点上, 同了c、d表示第2个人位置,问相邻站点之间的所用的时间是多少思路:明显差分约束,去求解不等式,首先这一题要求
ti <= 1e9
,那么为了不超过时间限制,我们应该求最小时间差 --> 那么转化的图上就是求最大距离,首先我们将所有的不等式转化为 a >= b + val,这样的形式,如果不是的话就移项转化成这样的
,建立b->a 边全为val 的边,对于 a > b + val -->我们转化为 a >= b + val + 1 这个时候我们 建立一条 b->a 权值为val + 1的边; 对于 a < b + val -->我们转化为 a < b + val - 1 --> 之后在同时在同时移动左右项转化为 :b >= a - (val - 1) 对于这样的情况我们建立一条 a ->b 权值为 -(val - 1) 的边;对于 b - a == val的情况我们可以把它转化成两个不等式:b - a >= val 、b - a <= val 在它们最终经过目标形式转化之后变成:b >= a + val (建立a -> b 边权为val的边)、a >= b -val (建立b->a 边权为 -val的边)
那么对于本题 如果 (a != b || c != d) ->我们可以发掘出两个不等式:c - b < k 、d - a > k ---->对这两个不等式进行目标转还建边, 如果(a == b && c== b) 的话 这个时候 c - b == k --->根据相等的情况进行目标转化 建边就行了
代码
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <stack>
using namespace std;
#define INF 0x3f3f3f3f
#define mod 1000000009
const int mxn = 5e6;
struct Edge
{
int v, w, next;
} edge[mxn];
int n, m, k;
int head[mxn];
int cnt = 0;
int use[mxn];
int dis[mxn];
int tim[mxn];
void Add(int u, int v, int w)
{
edge[++ cnt] = (Edge){ v, w, head[u] };
head[u] = cnt;
}
bool Spfa(int s)
{
for(int i = 1; i <= n; i ++)
use[i] = 0, tim[i] = 0, dis[i] = -INF;
dis[s] = 0;
queue<int> q;
q.push(s);
int u, v, w;
while(! q.empty())
{
u = q.front(), q.pop();
use[u] = 0;
tim[u] ++;
if(tim[u] > n) return false;
for(int i = head[u]; i; i = edge[i].next)
{
v = edge[i].v;
w = edge[i].w;
if(dis[v] < dis[u] + w)
{
dis[v] = dis[u] + w;
if(! use[v])
{
q.push(v);
use[v] = 1;
}
}
}
}
return true;
}
void init()
{
cnt = 0;
for(int i = 0; i <= n; i ++)
head[i] = 0;
}
int main()
{
/* freopen("A.txt","r",stdin); */
int t, Case = 1;
scanf("%d", &t);
while(t --)
{
scanf("%d %d %d", &n, &m, &k);
init();
int a, b, c, d;
for(int i = 1; i <= m; i ++)
{
scanf("%d %d %d %d", &a, &b, &c, &d);
if(a != b || c != d)
{
Add(c, b, -k + 1); //c - b < k -> c - b <= k - 1 -> b >= c - k + 1
Add(a, d, k + 1); //d - a > k -> d - a >= k + 1
}
else //a == b && c == d c - b == k --> (c - b >= k && c - b <= k)
{
Add(a, d, k);
Add(d, a, -k);
}
}
//增加超级源点或者相邻车站的时间间隔肯定>= 1
for(int i = 2; i <= n; i ++)
Add(i-1, i, 1);
printf("Case #%d:", Case ++);
if(Spfa(1))
{
for(int i = 2; i <= n; i ++)
printf(" %d", dis[i] - dis[i - 1]);
printf("\n");
}
else
printf(" IMPOSSIBLE\n");
}
return 0;
}
总结
- 对与这样的题,我们首相要根据题意弄懂要求的是最短距离还是最大距离
- 如果是让求的是最小值那么我们要把所有的不等式转化为:a >= b + val;若是让求的是最大值我们要把所有的不等式转化为为:a <= b + va ,然后相应边。
- 一般题目会包含隐含的限制(隐含的不等式条件)
- 之后还要建立一个超级源点保持图的连通性,(当然如过我们能通过 找到发掘 隐含的限制条件,以保证图的连通性,就可以不用建立超级源点)
I - 动物狂想曲 HDU - 6252(差分约束)的更多相关文章
- hdu 1531(差分约束)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1531 差分约束的题之前也碰到过,刚好最近正在进行图论专题的训练,就拿来做一做. ①:对于差分不等式,a ...
- hdu 4598 差分约束
思路:首先就是判断是否有奇环,若存在奇环,则输出No. 然后用差分约束找是否符合条件. 对于e(i,j)属于E,并且假设顶点v[i]为正数,那么v[i]-v[j]>=T--->v[j]-v ...
- hdu 3666(差分约束,手动栈解决超时问题)
THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- hdu 1364(差分约束)
King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12056 Accepted: 4397 Description ...
- hdu 1534(差分约束+spfa求最长路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1534 思路:设s[i]表示工作i的开始时间,v[i]表示需要工作的时间,则完成时间为s[i]+v[i] ...
- hdu 3440 差分约束
看完题目第一遍,感觉很简单.当写完程序跑测试用例的时候,发现第二个总是过不了,然后好好研究了一下测试用例,才知道原来不是程序有问题,而是我的建图方式错了.对于这些无序的点,如果高的在右边,不等式是di ...
- hdu 1534(差分约束)
Schedule Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdu 3440(差分约束好题)
House Man Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 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 ...
随机推荐
- Access Token 机制详解
我们在访问很多大公司的开放 api 的时候,都会发现这些 api 要求传递一个 access token 参数.这个参数是什么呢?需要去哪里获取这个 access token 呢? access to ...
- Java 抽象类 抽象方法 使用说明
知识点 什么是抽象类 抽象类与普通类主要两点不同: 1.在类的修饰符后面多了一个abstract关键字 2.抽象类是不允许通过new来实例化的 由于抽象类不能通过new来实例化,所以基本上是在继承中当 ...
- webpack压缩图片之项目资源优化
webpack打包时,会根据webpack.config.js 中url-loader中设置的limit大小来对图片进行处理,小于limit的图片转化成base64格式,其余的不做操作.对于比较大的图 ...
- python使用while循环实现九九乘法表
a = 1while a <= 9: b = 1 while b <= a: print("%d*%d=%d\t" % (b, a, a * b), end=" ...
- 【vue】---- v-model在自定义组件中的使用
1. v-model简介 可以用 v-model 指令在表单 <input>.<textarea> 及 <select> 元素上创建双向数据绑定,它的本质是一个语法 ...
- PG归并排序算法详解
前言 归并排序算法是连接算法中比较复杂的算法,相比嵌套循环与Hash匹配而言.本节会通过实例来说明该算法在PG中的具体实现. 在PG中,通过状态机来实现--归并-连接.当然这里的完整流程是排序--归并 ...
- Linux系统是什么?亲身自学经历分享
我是数字媒体专业学生,第一次接触LINUX的时候,是大一C语言课程里看到的,书上讲了C语言的发展历史.说到C语言的起源,就离不开UNIX系统.在20世纪60年代,贝尔实验室的研究员Ken Thomps ...
- Microsoft Visual Studio 修改语言包
需求内容: 更改 Microsoft Visual Studio 界面的语言包(将中文改为英文) 解决方案: https://docs.microsoft.com/zh-cn/visualstudio ...
- Struts UI标签的使用
先来看一下日期控件 html5标签中其实已经有日期的类型,用<input type="date">便可调用. struts里面也自带了日期控件,其使用步骤为: 1. 导 ...
- ipadmini从9.3.5降级8.4.1并完美越狱
ipadmini之前是iOS9.3.5实在是卡的用不了,于是打算降级,但是尝试了包括改版本描述等很多方法一直失败.今天突然成功降级8.4.1并且完美越狱,运行流畅了非常多.赶紧发个教程,回馈一下网友. ...