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+1

Output 对于每个测试用例,输出一行包含“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;
}

总结

  1. 对与这样的题,我们首相要根据题意弄懂要求的是最短距离还是最大距离
  2. 如果是让求的是最小值那么我们要把所有的不等式转化为:a >= b + val;若是让求的是最大值我们要把所有的不等式转化为为:a <= b + va ,然后相应边。
  3. 一般题目会包含隐含的限制(隐含的不等式条件)
  4. 之后还要建立一个超级源点保持图的连通性,(当然如过我们能通过 找到发掘 隐含的限制条件,以保证图的连通性,就可以不用建立超级源点)

I - 动物狂想曲 HDU - 6252(差分约束)的更多相关文章

  1. hdu 1531(差分约束)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1531 差分约束的题之前也碰到过,刚好最近正在进行图论专题的训练,就拿来做一做. ①:对于差分不等式,a ...

  2. hdu 4598 差分约束

    思路:首先就是判断是否有奇环,若存在奇环,则输出No. 然后用差分约束找是否符合条件. 对于e(i,j)属于E,并且假设顶点v[i]为正数,那么v[i]-v[j]>=T--->v[j]-v ...

  3. hdu 3666(差分约束,手动栈解决超时问题)

    THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. hdu 1364(差分约束)

    King Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12056   Accepted: 4397 Description ...

  5. hdu 1534(差分约束+spfa求最长路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1534 思路:设s[i]表示工作i的开始时间,v[i]表示需要工作的时间,则完成时间为s[i]+v[i] ...

  6. hdu 3440 差分约束

    看完题目第一遍,感觉很简单.当写完程序跑测试用例的时候,发现第二个总是过不了,然后好好研究了一下测试用例,才知道原来不是程序有问题,而是我的建图方式错了.对于这些无序的点,如果高的在右边,不等式是di ...

  7. hdu 1534(差分约束)

    Schedule Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. hdu 3440(差分约束好题)

    House Man Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. 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  ...

随机推荐

  1. Go coding in go way(用Go的思维去coding)

    本文是Tony Bai在2017年第三届GopherChina大会上所作,来源如下 https://tonybai.com/2017/04/20/go-coding-in-go-way/ 一.序 今天 ...

  2. agent判断用户请求设备

  3. PHP中elseif与else if的区别

    在PHP中,正常情况下elseif和else if的用法及效果是一样的,但在使用带冒号的if语句时(也就是php替代)情况会有点不一样,比如: <?php  /*正确的写法*/  $a = 1; ...

  4. racket学习-call/cc (let/cc)

    Drracket continuation 文中使用let/cc代替call/cc Racket文档中,let/cc说明为: (let/cc k body ...+) Equivalent to (c ...

  5. Spring Cloud 理论篇

    show me the code and talk to me,做的出来更要说的明白 github同步收录 我是布尔bl,你的支持是我分享的动力! 微服务 在 jsp 时代,应用前后端耦合,前后端 a ...

  6. 普通索引和唯一索引如何选择(谈谈change buffer)

    假设有一张市民表(本篇只需要用其中的name和id_card字段,有兴趣的可以翻看“索引”篇,里面有建表语句) 每个人都有一个唯一的身份证号,且业务代码已经保证不会重复. 由于业务需求,市民需要按身份 ...

  7. 建议14:灵活使用Arguments

    Javascript支持Arguments机制.Arguments是一个为数组,可以通过数组下标形式获取该集合中传递给函数的参数值.例如:下面函数中,没有指定形参,但在函数体内通过Arguments对 ...

  8. 读书笔记——吴翰清《白帽子讲Web安全》

    目录 第一篇 世界观安全 一 我的安全世界观 第二篇 客户端脚本安全 一 浏览器安全二 跨站脚本攻击(XSS)三 跨站点请求伪造(CSRF)四 点击劫持(ClickJacking)五 HTML5 安全 ...

  9. ChaosTool,iOS添加垃圾代码工具,代码混淆工具,代码生成器,史上最好用的垃圾代码添加工具,自己开发的小工具

    最近在H5游戏项目中需要添加垃圾代码作混淆,提高过审机率.手动添加太费时费力,在网上并没有找到合适的比较好的工具,就自己动手写了一个垃圾代码添加工具,命名为ChaosTool. 扣扣交流群:81171 ...

  10. Mol Cell Proteomics. | 粪便微生物蛋白质的组成与饮食诱导肥胖倾向的关联研究

    题目:Associations of the Fecal Microbial Proteome Composition and Proneness to Diet-induced Obesity 期刊 ...