[bzoj]3436 小K的农场

【题目描述】

小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述:农场a比农场b至少多种植了c个单位的作物,农场a比农场b至多多种植了c个单位的作物,农场a与农场b种植的作物数一样多。但是,由于小K的记忆有些偏差,所以他想要知道存不存在一种情况,使得农场的种植作物数量与他记忆中的所有信息吻合。

【输入格式】 farm.in

第一行包括两个整数n和m,分别表示农场数目和小K记忆中的信息数目。

接下来m行:

如果每行的第一个数是1,接下来有3个整数a,b,c,表示农场a比农场b至少多种植了c个单位的作物。

如果每行的第一个数是2,接下来有3个整数a,b,c,表示农场a比农场b至多多种植了c个单位的作物。

如果每行第一个数是3,家下来有2个整数a,b,表示农场a终止的数量和b一样多。

【输出格式】 farm.out

如果存在某种情况与小K的记忆吻合,输出“Yes”,否则输出“No”。

【样例输入】

3 3

3 1 2

1 1 3 1

2 2 3 2

【样例输出】

Yes

样例解释:三个农场种植数量可以为(2,2,1)。

对于100%的数据  1<=n,m,a,b,c<=10000.

裸的spfa_dfs判负环

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4
 5 struct Edge
 6 {
 7     int to,w,next;
 8 }E[10000001];
 9 int node=0,head[10001],dist[10001];
10 bool vis[10001];
11
12 int n,m;
13 bool flag;
14
15 void insert(int u,int v,int w)
16 {
17     E[++node]=(Edge){v,w,head[u]};
18     head[u]=node;
19 }
20
21 void spfa_dfs(int s)
22 {
23     vis[s]=1;
24     for(int i=head[s];i;i=E[i].next)
25     {
26         int to=E[i].to,w=E[i].w;
27         if(dist[s]+w<dist[to])
28         {
29             if(vis[to]){flag=1;return;}
30             else
31             {
32                 dist[to]=dist[s]+w;
33                 spfa_dfs(to);
34             }
35         }
36     }
37     vis[s]=0;
38 }
39
40 bool check()
41 {
42     flag=0;
43     memset(dist,0x7f,sizeof(dist));
44     memset(vis,0,sizeof(vis));
45     for(int i=1;i<=n;i++)
46     {
47         dist[i]=0;
48         spfa_dfs(i);
49         if(flag) return 1;
50     }
51     return 0;
52 }
53
54 int read()
55 {
56     int x=0,f=1;char ch=getchar();
57     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-f;ch=getchar();}
58     while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
59     return x*f;
60 }
61
62 int main()
63 {
64     n=read();m=read();
65     for(int i=1;i<=m;i++)
66     {
67         int f,a,b,c;
68         f=read();
69         switch(f)
70         {
71         case 1:
72             a=read();b=read();c=read();
73             insert(a,b,-c);
74             break;
75         case 2:
76             a=read();b=read();c=read();
77             insert(b,a,c);
78             break;
79         case 3:
80             a=read();b=read();
81             insert(a,b,0);
82             insert(b,a,0);
83             break;
84         }
85     }
86     if(check()) printf("No");
87     else printf("Yes");
88     return 0;
89 }
时间: 2024-10-10 10:58:46

[bzoj]3436 小K的农场的相关文章

BZOJ 3436: 小K的农场 差分约束

题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3436 题解: 裸的差分约束: 1.a>=b+c  ->  b<=a-c  ->  d[v]<=d[u]+w  ->  建一条边从a到b,权值为-c 2.a<=b+c  ->  d[v]<=d[u]+w  -> 建一条边从b到a,权值为c 3.a==b  ->  d[v]<=d[u]+0&&d[u]<=d

BZOJ 3436 小K的农场 查分约束系统 SPFA判负环

题目大意:农场中有一些土地,上面会长一些作物,现在给出一些约束条件,问有没有这种可能. 思路:裸的查分约束系统判负环.记住要跑最长路. CODE: #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 100010 using namespace std; int points,asks;

bzoj3436: 小K的农场(差分约束)

3436: 小K的农场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1575  Solved: 690[Submit][Status][Discuss] Description 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得 一些含糊的信息(共m个),以下列三种形式描述:农场a比农场b至少多种植了c个单位的作物,农场a比农场b至多 多种植了

bzoj3436: 小K的农场(差分约束)

3436: 小K的农场 题目:传送门 题解: 查分基础: t==1  a>=b+c t==2  b>=a-c t==3  a>=b+0 b>=a+0 跑最长路一A 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 int

P1993 小 K 的农场

P1993 小 K 的农场 题目描述 小 K 在 Minecraft 里面建立很多很多的农场,总共 n 个,以至于他自己都忘记了每个 农场中种植作物的具体数量了,他只记得一些含糊的信息(共 m 个),以下列三种形式描 述: 农场 a 比农场 b 至少多种植了 c 个单位的作物. 农场 a 比农场 b 至多多种植了 c 个单位的作物. 农场 a 与农场 b 种植的作物数一样多. 但是,由于小 K 的记忆有些偏差,所以他想要知道存不存在一种情况,使得农场的种 植作物数量与他记忆中的所有信息吻合. 输

洛谷 P1993 小K的农场

P1993 小K的农场 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了c个单位的作物, 农场a比农场b至多多种植了c个单位的作物, 农场a与农场b种植的作物数一样多. 但是,由于小K的记忆有些偏差,所以他想要知道存不存在一种情况,使得农场的种植作物数量与他记忆中的所有信息吻合. 输入输出格式 输入格式: 第一行包括两个整数 n 和 m,分别表示农场数目和小

P1993 小K的农场

P1993 小K的农场 这个题,涉及到的知识点是差分约束. 差分约束,是用来判断不等式是否有解集和求出一组特解的一种方法. 具体是使用最短(长)路算法. 观察最短路算法,有一个类似与三角形三边关系的不等式. \[dis[a]+weight>=dis[b]\] 其中a与b之间直接连了一条边权为weight的边. 通过我们熟练地水做一系列最短路,我们一眼就能看出这是正确的. 那我们再来看一个不等式\(x_1-x_2<=c\),其中\(c\)为常数 变一个型 \[x_1<=x_2+c\] \[

P1993 小K的农场 &amp;&amp; 差分约束

首先第一篇讨论的是差分约束系统解的存在 差分约束系统是有 \(n\) 个变量及 \(m\) 个(如 \(x_{i} - x_{j} \leq a_{k}\) )关系组成的系统 差分约束解的求解可以转化为图中最短路的求解问题 对一个标准的差分约束式, 我们可以如下连边\[x_{i} - x_{j} \leq a_{k}\ \Rightarrow \ V(j\ ,\ i), w[j,i] = a[k]\] 对于一个不是那么标准的差分约数式, 我们可以做如下变形:\[x_{i} - x_{j} \ge

BZOJ3436 小K的农场

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3436 Description 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述:农场a比农场b至少多种植了c个单位的作物,农场a比农场b至多多种植了c个单位的作物,农场a与农场b种植的作物数一样多.但是,由于小K的记忆有些偏差,所以他想要知道