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 2000000007
 8 #define N 1007
 9 #define M 10007
10 using namespace std;
11
12 int n,l,r;
13 int dis[N],num[N],ins[N];
14 int cnt,head[N],Next[M*3],rea[M*3],val[M*3];
15
16 void add(int u,int v,int fee)
17 {
18     Next[++cnt]=head[u];
19     head[u]=cnt;
20     rea[cnt]=v;
21     val[cnt]=fee;
22 }
23 bool Spfa()
24 {
25     for (int i=1;i<=n;i++)
26         ins[i]=0,dis[i]=INF,num[i]=0;
27     queue<int>q;
28     q.push(1);dis[1]=0,num[1]=1;
29     while(!q.empty())
30     {
31         int u=q.front();q.pop();
32         for (int i=head[u];i!=-1;i=Next[i])
33         {
34             int v=rea[i],fee=val[i];
35             if (dis[v]>dis[u]+fee)
36             {
37                 dis[v]=dis[u]+fee;
38                 if (!ins[v])
39                 {
40                     num[v]++;
41                     ins[v]=1;
42                     q.push(v);
43                     if (num[v]>n) return false;
44                 }
45             }
46         }
47         ins[u]=0;
48     }
49     return true;
50 }
51 int main()
52 {
53     int T;scanf("%d",&T);
54     while(T--)
55     {
56         cnt=0;
57         memset(head,-1,sizeof(head));
58         scanf("%d%d%d",&n,&l,&r);
59         for (int i=1,x,y,z;i<=l;i++)
60         {
61             scanf("%d%d%d",&x,&y,&z);
62             add(x,y,z);
63         }
64         for (int i=1,x,y,z;i<=r;i++)
65         {
66             scanf("%d%d%d",&x,&y,&z);
67             add(y,x,-z);
68         }
69         for (int i=2;i<=n;i++)
70             add(i+1,i,0);
71         bool flag=Spfa();
72         if (!flag) printf("-1\n");
73         else
74         {
75             if (dis[n]==INF) printf("-2\n");
76             else printf("%d\n",dis[n]);
77         }
78     }
79 }
时间: 2024-11-09 21:24:46

hdu3592(差分约束) (线性)的相关文章

POJ 3169 Layout(差分约束 线性差分约束)

题意: 有N头牛, 有以下关系: (1)A牛与B牛相距不能大于k (2)A牛与B牛相距不能小于k (3)第i+1头牛必须在第i头牛前面 给出若干对关系(1),(2) 求出第N头牛与第一头牛的最长可能距离, 若无解输出-1, 若无限长输出-2 分析: 3个关系对应的 <= 式子是: dis[b] - dis[a] <= d(1) dis[a] - dis[b] <= -d(2) dis[i] - dis[i+1] <= -1(2) 目标式:dis[N] - dis[1] <=

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

POJ3169 差分约束 线性

Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12522   Accepted: 6032 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

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.一类不等式组的解   二.最短路       1.Dijkstra       2.图的存储       3.链式前向星       4.Dijkstra + 优先队列       5.Bellman-Ford       6.SPFA       7.Floyd-Warshall   三.差分约束        1.数形结合        2.三角不等式        3.解的存在性        4.最大值

差分约束

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