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

题目大意:农场中有一些土地,上面会长一些作物,现在给出一些约束条件,问有没有这种可能.

思路:裸的查分约束系统判负环.记住要跑最长路.

CODE:

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 100010
using namespace std;

int points,asks;
int head[MAX],total;
int next[MAX << 1],aim[MAX << 1],length[MAX << 1];

int f[MAX],t[MAX];
bool v[MAX];

inline void Add(int x,int y,int len)
{
    next[++total] = head[x];
    aim[total] = y;
    length[total] = len;
    head[x] = total;
}

bool SPFA()
{
    static queue<int> q;
    memset(f,0xef,sizeof(f));
    f[0] = 0;
    q.push(0);
    while(!q.empty()) {
        int x = q.front(); q.pop();
        v[x] = false;
        for(int i = head[x]; i; i = next[i])
            if(f[aim[i]] < f[x] + length[i]) {
                f[aim[i]] = f[x] + length[i];
                if(!v[aim[i]]) {
                    v[aim[i]] = true;
                    q.push(aim[i]);
                    if(t[aim[i]] = t[x] + 1,t[aim[i]] > points)
                        return false;
                }
            }
    }
    return true;
}

int main()
{
    cin >> points >> asks;
    for(int flag,x,y,z,i = 1; i <= asks; ++i) {
        scanf("%d",&flag);
        if(flag == 2) {
            scanf("%d%d%d",&x,&y,&z);
            Add(x,y,-z);
        }
        else if(flag == 1) {
            scanf("%d%d%d",&x,&y,&z);
            Add(y,x,z);
        }
        else {
            scanf("%d%d",&x,&y);
            Add(x,y,0);
            Add(y,x,0);
        }
    }
    for(int i = 1; i <= points; ++i)
        Add(0,i,0);
    if(SPFA())  puts("Yes");
    else    puts("No");
    return 0;
}

时间: 2024-10-10 20:20:24

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

[luoguP1993] 小 K 的农场(差分约束 + spfa 判断负环)

传送门 差分约束系统..找负环用spfa就行 ——代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define N 100001 5 6 int n, m, cnt; 7 int head[N], to[N << 1], val[N << 1], next[N << 1], dis[N]; 8 bool vis[N]; 9 10 inline i

[bzoj]3436 小K的农场

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

bzoj 1690: [Usaco2007 Dec]奶牛的旅行——分数规划+spfa判负环

Description 作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天.旅行的前夜,奶牛们在兴奋地讨论如何最好地享受这难得的闲暇. 很幸运地,奶牛们找到了一张详细的城市地图,上面标注了城市中所有L(2 <= L <= 1000)座标志性建筑物(建筑物按1..L顺次编号),以及连接这些建筑物的P(2 <= P <= 5000)条道路. 按照计划,那天早上Farmer John会开车将奶牛们送到某个她们指定的建筑物旁边,等奶牛们完成她们的整个旅行并回到

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 1486][HNOI2009]最小圈(二分答案+dfs写的spfa判负环)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1486 分析:容易想到先二分答案x,然后把所有边的权值-x,那么如果图中存在权值和为0的环那就最好不过了,说明我们找到了这个环,但如果存在负环,则说明我们的x还可以更小,如果不存在负环,则说明我们的x大了.所以接下来的问题是如何判断负环了.可以用spfa,但bfs做的会TLE,因为每个点的松弛不具有连续性,如果用dfs写的话则效率会大大提高.2009集训队论文中有涉及.

洛谷P1993 小 K 的农场(查分约束)

/* 加深一下对查分约束的理解 建图的时候为了保证所有点联通 虚拟一个点 它与所有点相连 权值为0 然后跑SPFA判负环 这题好像要写dfs的SPFA 要不超时 比较懒 改了改重复进队的条件~ */ #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define maxn 40010 using namespace std; int n,m,num,head[maxn

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

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至多 多种植了

洛谷P1993 小 K 的农场

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