HDU3592 差分约束

World Exhibition

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 24 Accepted Submission(s): 15
 

Problem Description

Nowadays, many people want to go to Shanghai to visit the World Exhibition. So there are always a lot of people who are standing along a straight line waiting for entering. Assume that there are N (2 <= N <= 1,000) people numbered 1..N who are standing in the same order as they are numbered. It is possible that two or more person line up at exactly the same location in the condition that those visit it in a group.

There is something interesting. Some 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 X (1 <= X <= 10,000) constraints describes which person like each other and the maximum distance by which they may be separated; a subsequent list of Y constraints (1 <= Y <= 10,000) tells which person 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 person 1 and person N that satisfies the distance constraints.


Input

First line: An integer T represents the case of test.

The next line: Three space-separated integers: N, X, and Y.

The next X lines: Each line contains three space-separated positive integers: A, B, and C, with 1 <= A < B <= N. Person A and B must be at most C (1 <= C <= 1,000,000) apart.

The next Y lines: Each line contains three space-separated positive integers: A, B, and C, with 1 <= A < B <= C. Person A and B must be at least C (1 <= C <= 1,000,000) apart.


Output

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


Sample Input

1
4 2 1
1 3 8
2 4 15
2 3 4


Sample Output

19


Author

alpc20


Source

2010 ACM-ICPC Multi-University Training Contest(15)——Host by NUDT

题意:

给n个人排队,x对人相互喜欢,y对人相互讨厌,输入x行a,b,c表示a和b相互喜欢他们之间的距离要小于等于c,输入y行a,b,c表示a和b相互讨厌他们之间的距离要大于等于c,问是否存在这样的队列,如果不存在输出-1否则输出1到n之间的距离,如果这个距离是任意的则输出-2。、

代码:

//2-sat模板题,存在负环无解,dis[n]=inf说明1和n之间没有限制(没有边相连)可以是任意距离,否则输出dis[n];
//限制条件是两点之间的距离直接b-a<=c,如果是a,b之间有多少个.......要考虑端点b-(a-1)<=c;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=1003,inf=0x7fffffff;
int t,x,y,a,b,c;
struct node
{
    int to,next,val;
} edge[20004];//!
int mark[maxn],head[maxn],tot,dis[maxn],n,m,cnt[maxn];
void add(int a,int b,int c)
{
    edge[tot].to=b;
    edge[tot].next=head[a];
    edge[tot].val=c;
    head[a]=tot++;
}
bool spfa(int s)
{
    for(int i=0;i<=n;i++)
        dis[i]=inf;
    memset(mark,0,sizeof(mark));
    memset(cnt,0,sizeof(cnt));
    queue<int>q;
    dis[s]=0;
    mark[s]=1;
    cnt[s]++;
    q.push(s);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        mark[u]=0;
        for(int i=head[u]; i!=-1; i=edge[i].next)
        {
            int v=edge[i].to;
            if(dis[v]>dis[u]+edge[i].val)
            {
                dis[v]=dis[u]+edge[i].val;
                if(!mark[v])
                {
                    cnt[v]++;
                    if(cnt[v]>=n+1) return false;
                    q.push(v);
                    mark[v]=1;
                }
            }
        }
    }
    return true;
}
main()
{
   scanf("%d",&t);
   while(t--){
       memset(head,-1,sizeof(head));
       tot=0;
       scanf("%d%d%d",&n,&x,&y);
       for(int i=0;i<x;i++){
           scanf("%d%d%d",&a,&b,&c);
           add(a,b,c);
       }
       for(int i=0;i<y;i++){
           scanf("%d%d%d",&a,&b,&c);
           add(b,a,-c);
       }
       int tmp=spfa(1);
       if(!tmp) printf("-1\n");
       else if(dis[n]==inf) printf("-2\n");
       else printf("%d\n",dis[n]);
   }
   return 0;
}
时间: 2024-10-13 05:30:20

HDU3592 差分约束的相关文章

hdu3592(差分约束) (线性)

题意:一些牛按序号排成一条直线,有两种要求,A和B距离不得超过X,还有一种是A和B距离不得少于Y,问1和N可能的最大距离. 和poj那题一样,就是多了多组数据. 1 #include<cstring> 2 #include<cmath> 3 #include<iostream> 4 #include<algorithm> 5 #include<cstdio> 6 #include<queue> 7 #define INF 200000

hdu3592 World Exhibition --- 差分约束

这题建图没什么特别 x个条件:Sb-Sa<=c y个条件:Sa-Sb<=-c 题目问的是,1和n之间的关系. 有负环的话,整个就不可能成立,输出-1 如果图是连通的(1到n是连通的),就输出d[n] 不连通就是题目中说-2的情况. 原来我们建图一般添加一个附加结点,或者开始就把所有点入队,就是考虑到不连通的问题,所以添加一个没有意义的条件. #include <iostream> #include <cstring> #include <string> #i

差分约束

1.bzoj3436 思路: 差分约束根据限制条件建图,注意要有一个超级源点向所有点连一条边权为0的边建图看代码. 然后spfa判负环,写bfs会超时的......实测n遍. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define inf 0x7fffffff #define ll long long #define N 100007 using na

bzoj2788 festival 差分约束

填坑中--链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2788 题意: 有$n$个正整数$X1,X2,...,Xn$,再给出$m1+m2$个限制条件,限制分为两类:1. 给出$a,b(1<=a,b<=n)$,要求满足$Xa + 1 = Xb$2. 给出$c,d (1<=c,d<=n)$,要求满足$Xc <= Xd$在满足所有限制的条件下,求集合${Xi}$大小的最大值. 首先看情况我们也知道是差分约束-- 但是这个差分

POJ 1201 Intervals 差分约束

http://poj.org/problem?id=1201 TLE了很久,因为用了cin..... 思路和其他差分约束差不多,http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html 如果区间[a, b]中至少有c个元素,如果用上面的博客,那么说明xa - xb >= c,但是注意这里是闭区间,xa - xb是不包括b这个点的, 就比如用了[a, b]有c个元素,[b, d]有x个,那么ans = c + x - 1个,

【bzoj2330】: [SCOI2011]糖果 图论-差分约束-SPFA

[bzoj2330]: [SCOI2011]糖果 恩..就是裸的差分约束.. x=1 -> (A,B,0) (B,A,0) x=2 -> (A,B,1)  [这个情况加个A==B无解的要特判] x=3 -> (B,A,0)  [恩这个是不少于一开始zz建反了] x=4 -> (B,A,1) x=5 -> (A,B,0) 然后源点到所有点建1的边[恩据说有条链所以要反着连]跑最长路就好了 1 /* http://www.cnblogs.com/karl07/ */ 2 #inc

POJ1275出纳员的雇佣【差分约束】

出纳员的雇佣 Tehran的一家每天24小时营业的超市,需要一批出纳员来满足它的需要.超市经理雇佣你来帮他解决问题:超市在每天的不同时段需要不同数目的出纳员(例如:午夜时只需一小批,而下午则需要很多)来为顾客提供优质服务.他希望雇佣最少数目的出纳员.经理已经提供你一天的每一小时需要出纳员的最少数量--R(0), R(1), ..., R(23).R(0)表示从午夜到上午1:00需要出纳员的最少数目,R(1)表示上午1:00到2:00之间需要的,等等.每一天,这些数据都是相同的.有N人申请这项工作

【POJ3169 】Layout (认真的做差分约束)

Layout 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 ar

POJ 3169 Layout (差分约束)

题意:给定一些母牛,要求一个排列,有的母牛距离不能超过w,有的距离不能小于w,问你第一个和第n个最远距离是多少. 析:以前只是听说过个算法,从来没用过,差分约束. 对于第 i 个母牛和第 i+1 个,D[i] - D[i+1] <= 0,  D[j] -D[i ]<= k, D[i] - D[j] <= - k,那么这个题就可以用差分约束来求这个不等式组了. 1.对于差分不等式,a - b <= c ,建一条 b 到 a 的权值为 c 的边,求的是最短路,得到的是最大值(本题求的就