[Usaco2005 dec]Layout

题目描述

当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近些。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号奶牛间可能的最大距离。

输入

第一行:三个空间分隔的整数:N,ML,和MD

第二行至第ML+1行:每行包含三个空间分隔的正整数:A,B和D,其中1<=
A<=N。表示牛A和牛B必须在距离D以内。第ML+2至第ML+MD+1行:每行包含三个空间分隔的正整数:A,B和D,其中1 <=
A<=N。表示牛A和牛B必须在距离D以上。

输出

输出仅有一个整数。如果不可能安排奶牛的布局,输出-1。如果奶牛1和奶牛N可以相距任意距离,输出-2。否则输出奶牛1和奶牛N之间的最大距离。

样例输入

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

样例输出

27差分约束,由于题目求最大值,所以最短路,把约束条件化成x-y<=b的形式
对于距离条件:d[i+1]>=d[i]        =>       d[i]-d[i+1]<=0      =>     连一条从i+1到i,权值为0的边对于喜欢条件:d[x]-d[y]<=L(x>y)   =>       连一条从y到x,权值为L的边对于讨厌条件:d[x]-d[y]>=L(x>y)   =>       d[y]-d[x]<=-L       =>     连一条从x到y,权值为-L的边
存在负环,输出-1,从1号点走不到n号点,输出-2把一号奶牛看成在原点,答案为d[n]
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f,n,ml,md,nxt[100000],to[100000],c[100000],h[1111],que[10000000],H,T,k,d[1111];
bool inq[1111];int cnt[1111];
void ins(int u,int v,int t){nxt[++k]=h[u];to[k]=v;c[k]=t;h[u]=k;}
int spfa()
{
    memset(inq,0,sizeof(inq));memset(cnt,0,sizeof(cnt));memset(d,127,sizeof(d));int INF=d[1];
    d[1]=0;inq[1]=1;cnt[1]++;H=0;T=0;que[T++]=1;
    while(H<T)
    {
        int u=que[H++];inq[u]=0;
        for(int i=h[u];i;i=nxt[i])
        {
            int v=to[i],t=c[i];
            if(d[v]>d[u]+t)
            {
                d[v]=d[u]+t;cnt[v]++;
                if(cnt[v]>n)return -1;
                if(!inq[v])inq[v]=1,que[T++]=v;
            }
        }
    }
    if(d[n]==INF)return -2;
    return d[n];
}
int main()
{
    scanf("%d%d%d",&n,&ml,&md);
    for(int i=1;i<n;i++)ins(i+1,i,0);
    for(int i=1;i<=ml;i++)
    {
        int u,v,C;scanf("%d%d%d",&u,&v,&C);ins(u,v,C);
    }
    for(int i=1;i<=md;i++)
    {
        int u,v,C;scanf("%d%d%d",&u,&v,&C);ins(v,u,-C);
    }
    printf("%d",spfa());
    return 0;
} 

 
时间: 2025-01-01 09:39:28

[Usaco2005 dec]Layout的相关文章

bzoj1730 [Usaco2005 dec]Barn Expansion 牛棚扩张

1730: [Usaco2005 dec]Barn Expansion 牛棚扩张 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 134  Solved: 72[Submit][Status][Discuss] Description Farmer John has N (1 <= N <= 25,000) rectangular barns on his farm, all with sides parallel to the X and Y ax

BZOJ 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚

题目 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farmer John's cows, pampered since birth, have reached new heights of fastidiousness. They now require their barn to be immaculate. Farmer John, the most

bzoj1673[Usaco2005 Dec]Scales 天平*

bzoj1673[Usaco2005 Dec]Scales 天平 题意: n个砝码,每个砝码重量大于前两个砝码质量和,天平承重为c,求天平上最多可放多种的砝码.n≤1000,c≤2^30. 题解: 斐波那契数列到30多项就爆int了,所以本题n其实≤30.故爆搜即可,加个剪枝:当前选的砝码质量和+剩下砝码质量和仍≤ans就返回. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #

POJ3170 Bzoj1671 [Usaco2005 Dec]Knights of Ni 骑士

1671: [Usaco2005 Dec]Knights of Ni 骑士 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 281  Solved: 180[Submit][Status][Discuss] Description Bessie is in Camelot and has encountered a sticky situation: she needs to pass through the forest that is guarde

BZOJ1671: [Usaco2005 Dec]Knights of Ni

1671: [Usaco2005 Dec]Knights of Ni Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 175  Solved: 107[Submit][Status][Discuss] Description Bessie is in Camelot and has encountered a sticky situation: she needs to pass through the forest that is guarded b

[BZOJ1672][Usaco2005 Dec]Cleaning Shifts 清理牛棚

1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 953  Solved: 407 [Submit][Status][Discuss] Description Farmer John's cows, pampered since birth, have reached new heights of fastidiousness. They now require the

【BZOJ1671】[Usaco2005 Dec]Knights of Ni 骑士 BFS

[Usaco2005 Dec]Knights of Ni 骑士 Description 贝茜遇到了一件很麻烦的事:她无意中闯入了森林里的一座城堡,如果她想回家,就必须穿过这片由骑士们守护着的森林.为了能安全地离开,贝茜不得不按照骑士们的要求,在森林寻找一种特殊的灌木并带一棵给他们.当然,贝茜想早点离开这可怕的森林,于是她必须尽快完成骑士们给的任务,贝茜随身带着这片森林的地图,地图上的森林被放入了直角坐标系,并按x,y轴上的单位长度划分成了W×H(1≤W,H≤1000)块,贝茜在地图上查出了她自己

1671: [Usaco2005 Dec]Knights of Ni 骑士

1671: [Usaco2005 Dec]Knights of Ni 骑士 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 254  Solved: 163[Submit][Status][Discuss] Description Bessie is in Camelot and has encountered a sticky situation: she needs to pass through the forest that is guarde

[Usaco2005 Dec]Cleaning Shifts

[Usaco2005 Dec]Cleaning Shifts 给出n段区间,左右端点分别为\(l_i,r_i\),以及选取这段区间的费用\(c_i\),现在要选出若干个区间,使其完全覆盖区间\([m,e]\),询问费用之和的最小值,\(1≤n≤10000,0≤m≤e≤86399\). 解 法一: 不妨把区间按左端点排序,如果在大区间范围外,可以筛除,虽然题目有保障,于是设\(f_i\)表示以第i个区间结尾,覆盖第i个区间前所有需要覆盖的位置的最少代价,于是有 \[f_i=\min_{j=1,r_