题目描述

正如其他物种一样,奶牛们也喜欢在排队打饭时与它们的朋友挨在一起。\(FJ\) 有编号为 \(1\dots N\) 的 \(N\) 头奶牛 \((2\le N\le 1000)\)。开始时,奶牛们按照编号顺序来排队。奶牛们很笨拙,因此可能有多头奶牛在同一位置上。

有些奶牛是好基友,它们希望彼此之间的距离小于等于某个数。有些奶牛是情敌,它们希望彼此之间的距离大于等于某个数。

给出 \(M_L\)​ 对好基友的编号,以及它们希望彼此之间的距离小于等于多少;又给出 \(M_D\)​ 对情敌的编号,以及它们希望彼此之间的距离大于等于多少 \((1≤M_L​, M_D\le 10^4)\)

请计算:如果满足上述所有条件,\(1\) 号奶牛和 \(N\) 号奶牛之间的距离最大为多少。

输入输出格式

输入格式

第一行:三个整数 \(N, M_L, M_D\)​,用空格分隔。

第 \(2\dots M_L+1\) 行:每行三个整数 \(A, B, D\),用空格分隔,表示 \(A\) 号奶牛与 \(B\) 号奶牛之间的距离须 \(\le D\)。保证 \(1\le A<B\le N\), \(1\le D\le 10^6\).

第 \(M_L+2\dots M_L+M_D+1\) 行:每行三个整数 \(A, B, D\),用空格分隔,表示 \(A\) 号奶牛与 \(B\) 号奶牛之间的距离须 \(\ge D\)。保证 \(1\le A<B\le N\), \(1\le D\le 10^6\).

输出格式

一行,一个整数。如果没有合法方案,输出 \(-1\). 如果有合法方案,但 \(1\) 号奶牛可以与 \(N\) 号奶牛相距无穷远,输出\(-2\). 否则,输出 \(1\) 号奶牛与 \(N\) 号奶牛间的最大距离。

输入输出样例

输入样例#1:

4 2 1
1 3 10
2 4 20
2 3 3

输出样例#1:

27

思路:

做这道题之前,大家应该先学习一下差分约束。

给大家推荐个博客:不是我的……

然后回到这个题目上来,首先这道题有负环的出现,那显然不能用\(dijkstra\)了,那就把解法锁定为\(spfa\)。

对于给出的前\(M_L\)种关系:

就是这个样子:\(d[B]-d[A] \leq D\)

后\(M_D\)种关系是:\(d[B]-d[A] \geq D\),即\(d[A]-d[B] \leq -D\)

那对于第一种关系,根据差分约束,我们需要建从\(A\)到\(B\),边权为D的边,对于第二种关系,我们就需要建从\(B\)到\(A\),边权为\(-D\)的边。

这样建完图跑直接调用\(spfa(1)\)就可以得\(70\)分了,那为什么不能\(AC\)

呢?

因为我们差分约束时的起点是\(0\),所以我们要先跑一遍\(spfa(0)\),并建一条从0到\(i(1 \leq i \leq n)\)的边权为0的边,为什么呢?

难道不应该是\(d[0]-d[i] \leq 0\)么?这样不是应该从i到0的边么?但是,有没有想过,如果你这样建,那你以0为起点跑spfa有意义么?0没法到达任何一个点,所以,我们需要建一条从0到i的边的边权为0的边。这样这题就能AC啦!

自己整理的题解

下面是我丑陋(学长说的)的代码:

#include<cstdio>
#include<algorithm>
#include<cctype>
#include<cstring>
#include<queue>
#define maxn 1007
using namespace std;
int num,n,m,p,head[maxn],dis[maxn],vis[maxn],in[maxn];
inline int qread() {
char c=getchar();int num=0,f=1;
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) num=num*10+c-'0';
return num*f;
}
struct node {
int v,w,nxt;
}e[20007];
inline void ct(int u, int v, int w) {
e[++num].v=v;
e[num].w=w;
e[num].nxt=head[u];
head[u]=num;
}
const int inf=0x3f3f3f3f;
inline void spfa(int s) {
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
memset(in,0,sizeof(in));
queue<int>q;
q.push(s),vis[s]=1,in[s]=1;
dis[s]=0;
while(!q.empty()) {
int u=q.front();
q.pop();vis[u]=0;
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].v;
if(dis[v]>dis[u]+e[i].w) {
dis[v]=dis[u]+e[i].w;
if(!vis[v]) {
vis[v]=1;
in[v]++;
if(in[v]>n) {
printf("-1\n");
exit(0);
}
q.push(v);
}
}
}
}
}
int main() {
n=qread(),m=qread(),p=qread();
for(int i=1,u,v,d;i<=m;++i) {
u=qread(),v=qread(),d=qread();
ct(u,v,d);
}
for(int i=1,u,v,d;i<=p;++i) {
u=qread(),v=qread(),d=qread();
ct(v,u,-d);
}
for(int i=1;i<=n;++i) ct(0,i,0);
spfa(0);
spfa(1);
if(dis[n]==inf) {
printf("-2\n");
return 0;
}
printf("%d\n",dis[n]);
return 0;
}

洛谷P4878 [USACO05DEC]layout布局的更多相关文章

  1. 洛谷 P4878 [USACO05DEC]layout布局

    题面链接 sol:差分约束系统裸题,根据a+b<=c建个图跑个最短路就没了... #include <queue> #include <cstdio> #include ...

  2. P4878 [USACO05DEC]layout布局

    P4878 [USACO05DEC]layout布局 差分约束 最短路径最长路,最长路径最短路 本题求的是最长路径,所以跑最短路 根据题意连边,然后spfa即可 注意要判断图的连通性,所以新建一个虚拟 ...

  3. 差分约束算法————洛谷P4878 [USACO05DEC] 布局

    题目: 不难看出题意主要是给出ml+md个格式为xi-xj<=ak的不等式,xi-xj为i,j俩头牛的距离,要我们求x1-xn的最大值. 经过上下加减我们可以将这几个不等式化成x1-xn< ...

  4. 【洛谷P4878】布局

    题目大意:给定一个长度为 N 的递增序列,有 M 组差分约束关系,求满足这些约束关系时,第一个数和第 N 个数的差是多少. 题解:首先,能否满足约束关系需要判断一下负环,若满足约束关系,再从第一个点 ...

  5. 洛谷 P1379 八数码难题 Label:判重&&bfs

    特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...

  6. 洛谷 P1219 八皇后【经典DFS,温习搜索】

    P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...

  7. 洛谷 p1219 八皇后

    刚参加完蓝桥杯 弱鸡错了好几道..回头一看确实不难 写起来还是挺慢的 于是开始了刷题的道路 蓝桥杯又名搜索杯 暴力杯...于是先从dfs刷起 八皇后是很经典的dfs问题 洛谷的这道题是这样的 上面的布 ...

  8. 洛谷P1219 :八皇后(DFS+回溯)

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

  9. 洛谷P1219 八皇后【dfs】

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

随机推荐

  1. 关于MFC预处理命令

    MFC程序生成EXE文件的过程是:预处理-编译-链接-打包生成exe文件.(预编译是编译过程,即将一些常用的不经常改变的文件先进行编译处理生成中间文件,以节省时间,它不属于预处理,在VS项目属性的C/ ...

  2. SQL Server 2008可以安装在win7 64位的系统上吗?

    可以安装的.SQL 支持32和64位.安装时它自动选择的.下载时注意是完整安装包. SQLFULL_CHS 2008.iso大小:3.28G 已经过百度安全检测,放心下载  

  3. 用JavaScript实现表单按回车自动提交

    JavaScript实现表单form1按回车自动提交代码如下: <script type="text/javascript"> function submitMe() ...

  4. python 标准库 —— 线程与同步(threading、multiprocessing)

    1. 创建线程 使用 os 下的 fork() 函数调用(仅限 Unix 系统) import os print('current process (%s) starts ...' % (os.get ...

  5. 继续学习:C语言关键字

    auto :声明自动变量 break:跳出当前循环 case:开关语句分支 char :声明字符型变量或函数 const :声明只读变量 continue:结束当前循环,开始下一轮循环 default ...

  6. bzoj 2125 最短路——仙人掌两点间最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2125 因为看了TJ又抄了标程,现在感觉还是轻飘飘的……必须再做一遍. 两点间的情况: 1.直 ...

  7. bzoj 1001 狼抓兔子 —— 平面图最小割(最短路)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 平面图最小割可以转化成最短路问题: 建图时看清楚题目的 input ... 代码如下: ...

  8. yum配置文件位置

    centos的yum配置文件 cat /etc/yum.conf cachedir=/var/cache/yum //yum 缓存的目录,yum 在此存储下载的rpm 包和数据库,默认设置为/var/ ...

  9. IPC的使用

    IPC,Inter-Processor Communication是SYS/BIOS处理核间通信的组件: IPC的几种应用方式: 1.最小使用(Minimal use) 这种情况是通过核间的通知机制( ...

  10. JVM体系结构之三:方法区之1

    一.简介 方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域.在方法区中,存储了每个类的信息(包括类的名称.方法信息.字段信息).静态变量.常量以及编译器编译后的代码等. 方法区( ...