【bzoj1731】Layout 排队布局

1731: [Usaco2005 dec]Layout 排队布局

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 868  Solved: 495
[Submit][Status][Discuss]

Description

Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 <= N <= 1,000) cows numbered 1..N standing along a straight line waiting for feed. The cows are standing in the same order as they are numbered, and since they can be rather pushy, it is possible that two or more cows can line up at exactly the same location (that is, if we think of each cow as being located at some coordinate on a number line, then it is possible for two or more cows to share the same coordinate). Some cows like each other and want to be within a certain distance of each other in line. Some really dislike each other and want to be separated by at least a certain distance. A list of ML (1 <= ML <= 10,000) constraints describes which cows like each other and the maximum distance by which they may be separated; a subsequent list of MD constraints (1 <= MD <= 10,000) tells which cows dislike each other and the minimum distance by which they must be separated. Your job is to compute, if possible, the maximum possible distance between cow 1 and cow N that satisfies the distance constraints.

当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近些。FJ有N(2<=N<=1000)头奶牛,编号从1到N,沿一条直线站着等候喂食。奶牛排在队伍中的顺序和它们的编号是相同的。因为奶牛相当苗条,所以可能有两头或者更多奶牛站在同一位置上。即使说,如果我们想象奶牛是站在一条数轴上的话,允许有两头或更多奶牛拥有相同的横坐标。一些奶牛相互间存有好感,它们希望两者之间的距离不超过一个给定的数L。另一方面,一些奶牛相互间非常反感,它们希望两者间的距离不小于一个给定的数D。给出ML条关于两头奶牛间有好感的描述,再给出MD条关于两头奶牛间存有反感的描述。(1<=ML,MD<=10000,1<=L,D<=1000000)你的工作是:如果不存在满足要求的方案,输出-1;如果1号奶牛和N号奶牛间的距离可以任意大,输出-2;否则,计算出在满足所有要求的情况下,1号奶牛和N号奶牛间可能的最大距离。

Input

* Line 1: Three space-separated integers: N, ML, and MD. * Lines 2..ML+1: Each line contains three space-separated positive integers: A, B, and D, with 1 <= A < B <= N. Cows A and B must be at most D (1 <= D <= 1,000,000) apart. * Lines ML+2..ML+MD+1: Each line contains three space-separated positive integers: A, B, and D, with 1 <= A < B <= N. Cows A and B must be at least D (1 <= D <= 1,000,000) apart.

Output

* Line 1: A single integer. If no line-up is possible, output -1. If cows 1 and N can be arbitrarily far apart, output -2. Otherwise output the greatest possible distance between cows 1 and N.

Sample Input

4 2 1

1 3 10

2 4 20

2 3 3

INPUT DETAILS:

There are 4 cows. Cows #1 and #3 must be no more than 10 units

apart, cows #2 and #4 must be no more than 20 units apart, and cows

#2 and #3 dislike each other and must be no fewer than 3 units apart.

Sample Output

27

四只牛分别在0,7,10,27.

HINT

Source

Gold

题意:

$N$头牛排队,有一些牛希望自己和另一只牛距离不超过$D$(日久生情),

还有一些牛希望自己和另一只牛距离不小于$D$(因爱生恨)。

问满足所有条件时$1$号牛和$N$号牛的距离最远是多少?

题解:

看到形如三角形不等式的约束条件基本就可以想差分约束的建图了。

(毕竟我好像也没学过多少处理三角形不等式的方法吧)

询问距离最大值一定是计算最短路的,那么只需要将不等式转化成$s_i-s_j\leq w$的形式即可。

转换完成后跑$spfa$,这道题跟板有一点小区别:

  • 当图上存在负环时,肯定不能满足所有条件,输出$-1$。
  • 当$dis_n=\infty$时,$n$与$1$无约束,即可以任意大,输出$-2$。
  • 否则,输出$dis_n$。

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>

using namespace std;
#define MAXN 100005
#define MAXM 500005
#define INF 0x3f3f3f3f
#define ll long long

int hd[MAXN],to[MAXN<<1],cnt;
int nxt[MAXN<<1],cst[MAXN<<1];
int dis[MAXN];bool vis[MAXN]; 

inline int read(){
    int x=0,f=1;
    char c=getchar();
    for(;!isdigit(c);c=getchar())
        if(c==‘-‘)
            f=-1;
    for(;isdigit(c);c=getchar())
        x=x*10+c-‘0‘;
    return x*f;
}

inline void addedge(int u,int v,int w){
    to[++cnt]=v,cst[cnt]=w;
    nxt[cnt]=hd[u],hd[u]=cnt;
    return;
}

inline bool spfa_dfs(int u){
    vis[u]=1;
    for(int i=hd[u];i;i=nxt[i]){
        int v=to[i];
        if(dis[v]>dis[u]+cst[i]){
            if(vis[v]) return 0;
            dis[v]=dis[u]+cst[i];
            if(!spfa_dfs(v)) return 0;
        }
    }
    vis[u]=0;
    return 1;
}

inline void spfa_bfs(int s){
    memset(dis,63,sizeof(dis));
    memset(vis,0,sizeof(vis));
    queue<int> q;q.push(s);
    dis[s]=0;vis[s]=1;
    while(!q.empty()){
        int u=q.front();
        q.pop();vis[u]=0;
        for(int i=hd[u];i;i=nxt[i]){
            int v=to[i];
            if(dis[v]>dis[u]+cst[i]){
                dis[v]=dis[u]+cst[i];
                if(!vis[v])
                    q.push(v),vis[v]=1;
            }
        }
    }
    return;
}

int main(){
    int N=read(),M1=read(),M2=read();
    for(int i=1;i<=M1;i++){
        int u=read(),v=read(),w=read();
        if(u>v) swap(u,v);
        addedge(u,v,w);
    }
    for(int i=1;i<=M2;i++){
        int u=read(),v=read(),w=read();
        if(u>v) swap(u,v);
        addedge(v,u,-w);
    }
    for(int i=1;i<=N;i++) addedge(i,i-1,0);
    memset(dis,63,sizeof(dis));
    dis[1]=0;
    if(!spfa_dfs(1)){
        printf("-1\n");
        return 0;
    }
    spfa_bfs(1);
    if(dis[N]>=INF){
        printf("-2\n");
        return 0;
    }
    printf("%d\n",dis[N]);
    return 0;
}

原文地址:https://www.cnblogs.com/YSFAC/p/9906765.html

时间: 2024-10-25 18:14:08

【bzoj1731】Layout 排队布局的相关文章

【ALearning】第四章 Android Layout组件布局(二)

前面我们分别介绍和学习了LinearLayout(线性布局).FrameLayout(单帧布局)和AbsoluteLayout(绝对布局).这次我们要进行RelativeLayout(相对布局)和TableLayout(表格布局)的学习.这部分是很重要的知识点.RelativeLayout是开发过程中强烈建议使用的,而TableLayout是满足一些特定需求时(常见表格显示,但不局限于此)需要使用. [博客专栏:http://blog.csdn.net/column/details/alearn

Unity_UGUI翻译(2) Basic Layout(基本布局)

Basic Layout(基本布局) In this section we’ll look at how you can position UI elements relative to the Canvas and each other. If you want to test yourself while reading, you can create an Image using the menu GameObject > UI > Image. 在这一节中,我们将会尝试如何摆放UI元素

自定义layout中布局文件的属性

以前一直都是用ndroid自带的属性,突然发现自定义xml属性也是非常重要,于是总结了一下. 在values文件夹下新建的attr.xml文件,该文件为自定义属性. //attr.xml <?xml version="1.0" encoding="utf-8"?> <resources> <!-- MyView为自定义视图类 --> <!-- 注意:自定义属性必须一个不少的添加到布局文件中,否则编译失败 --> <

Bzoj1731 排队布局

当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近些.FJ 有 N 头奶牛,编号从 1 到 N,沿一条直线站着等候喂食.奶牛排在队伍中的顺序和它们的编号是相同的.因为奶牛相当苗条,所以可能有两头或者更多奶牛站在同一位置上.即使说,如果我们想象奶牛是站在一条数轴上的话,允许有两头或更多奶牛拥有相同的横坐标.一些奶牛相互间存有好感,它们希望两者之间的距离不超过一个给定的数 L.另一方面,一些奶牛相互间非常反感,它们希望两者间的距离不小于一个给定的数 D.给出 ML条关于两头奶牛间有好感的描述,再给出 M

layout(布局)组件

一.依赖于 Panel(面 板)组件和 resizable(调整大小)组件. 二.class加载方式    <div id="box" class="easyui-layout" style="height: 600px;width: 400px"> <div data-options="region:'north'" title="north" style="height: 1

【ALearning】第四章 Android Layout组件布局(一)

在本章中,我们将Android学习组件布局.在前面的章节,我们也开始使用LinearLayout布局.然后我们在布局文件更加具体的学习和理解,会. Android的界面是有布局和组件协同完毕的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件依照布局的要求依次排列.就组成了用户所看见的界面. Android的五大布局各自是LinearLayout(线性布局).FrameLayout(单帧布局).RelativeLayout(相对布局).AbsoluteLayout(绝对布局)和Table

Androd Studio layout页面布局无法预览

Could not initialize class android.support.v7.internal.widget.ActionBarOverlayLayout 导致无法看到布局页面,解决方法,在style.xml文件中查看一下前面有没有Base,如果没有,加上就ok了 Base.Theme.AppCompat.Light.DarkActionBar

【UOJ 281】排队布局

[题目描述]: 当排队等候喂食时,奶牛喜欢和它们的朋友靠近些.FJ 有N头奶牛,编号从1到N,沿一条直线站着等候喂食.奶牛排在队伍中的顺序和它们的编号是相同的.因为奶牛相当苗条,所以可能有两头或者更多奶牛站在同一位置上.如果我们想象奶牛是站在一条数轴上的话,允许有两头或更多奶牛拥有相同的横坐标.一些奶牛相互间存有好感,它们希望两者之间的距离不超过一个给定的数L.另一方面,一些奶牛相互间非常反感,它们希望两者间的距离不小于一个给定的数D.给出ML条关于两头奶牛间有好感的描述,再给出MD条关于两头奶

Android 布局学习之——Layout(布局)详解一

layout(布局)定义了用户界面的可视化结构(visual structure),如Activity的UI,应用窗口的UI. 有两种方式声明layout: 1.在xml文件中声明UI组件. 2.在运行时,实例化布局元素.我们可以以编码的方式创建View或ViewGroup对象,操纵它们的属性. 下面用一个小例子来学习怎样以编码的方式添加layout: 1 import android.app.Activity; 2 import android.graphics.Color; 3 import