• LOJ10090


    题目描述

    原题来自:USACO 2005 Dec. Gold

    FJ 有 n 头奶牛(2<=n<=1000) ,编号为1..n 。奶牛们将按照编号顺序排成一列队伍(可能有多头奶牛在同一位置上)。换句话说,假设 i 号奶牛位于 p_i,则 p_1<=p_2<=...<=p_n。

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

    给出 m_l 对好基友的编号,以及它们希望彼此之间的距离小于等于多少;又给出 m_d 对情敌的编号,以及它们希望彼此之间的距离大于等于多少  (1<=m_l,m_d<=1e4)。

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

    输入格式

    第一行:三个整数 n,m_l,m_d,用空格分隔。
    第 2...m_l+1 行:每行三个整数 a,b,d,用空格分隔,表示P_b-p_a<=d 。
    第 m_l+2.. m_l+m_d+1 行:每行三个整数 a,b,d,用空格分隔,表示P_b-p_a>=d 。
    保证 1<=a<=b<=n,1<=d<=1e6 。

    输出格式

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

    样例
    输入复制
    4 2 1
    1 3 10
    2 4 20
    2 3 3
    输出复制
    27

    这四头牛分别位于 0,7,10,27。

    ______________________
     
    差分约束
    注意,1号店约束不到n好点,但是其余的点中间构成负环的情况!!!
    如:
    10 2 1
    2 3 2
    3 4 2
    2 4 1012

    ______________________

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=1010;
     4 const int maxm=1e4+10;
     5 int n,ml,md;
     6 struct edge
     7 {
     8     int u,v,nxt;
     9     long long w;
    10 }e[maxm*4];
    11 int head[maxn],js;
    12 void addage(int u,int v,long long w)
    13 {
    14     e[++js].u=u;e[js].v=v;e[js].w=w;
    15     e[js].nxt=head[u];head[u]=js;
    16 }
    17 long long dis[maxn];
    18 bool inq[maxn];
    19 deque<int>q;
    20 int cs[maxn];
    21 bool spfa()
    22 {
    23     memset(dis,0x3f,sizeof dis);
    24     inq[0]=1;dis[0]=0;
    25     q.push_back(0);++cs[0];
    26     while(!q.empty())
    27     {
    28         int u=q.front();q.pop_front();inq[u]=0;
    29         for(int i=head[u];i;i=e[i].nxt)
    30         {
    31             int v=e[i].v,w=e[i].w;
    32             if(dis[v]>dis[u]+w)
    33             {
    34                 dis[v]=dis[u]+w;
    35                 if(!inq[v])
    36                 {
    37                     inq[v]=1;++cs[v];
    38                     if(cs[v]>n)return 0;
    39                     if(!q.empty()&& dis[v]<=dis[q.front()])q.push_front(v);
    40                     else q.push_back(v);
    41                 }
    42             }
    43         }
    44     }
    45     return 1;
    46 }
    47 int main()
    48 {
    49     scanf("%d%d%d",&n,&ml,&md);
    50     for(int i=1;i<n;++i)addage(i+1,i,0),addage(0,i,0x3f3f3f3f3f3f3f3f);
    51     addage(0,1,0);
    52     for(int a,b,d,i=1;i<=ml;++i)
    53     {
    54         scanf("%d%d%d",&a,&b,&d);
    55         addage(a,b,d);
    56     }
    57     for(int a,b,d,i=1;i<=md;++i)
    58     {
    59         scanf("%d%d%d",&a,&b,&d);
    60         addage(b,a,-d);
    61     }
    62     if(spfa()==0)puts("-1");
    63     else if(dis[n]==0x3f3f3f3f3f3f3f3f)puts("-2");
    64     else printf("%lld",dis[n]);
    65     
    66     return 0;
    67 }
    View Code
  • 相关阅读:
    超文本传输协议 HTTP/1.0 Hyptertext Transfer Protocol
    VB.NET中使用代表对方法异步调用
    蚂蚁解道德经(1)[转载]
    vb.net 类的属性的设置和获取问题
    VB.net入门(6):类~构造函数,事件
    什么是Ajax技术
    千里之外
    一个asp.net2005的页面文件调用CSS样式的BUG
    一个.net发送HTTP数据实体的类
    利用ASP发送和接收XML数据的处理方法
  • 原文地址:https://www.cnblogs.com/gryzy/p/14226614.html
Copyright © 2020-2023  润新知