bzoj3436

差分约束系统

按题目建边就行了,大于等于号是最长路,小于等于号是最短路,边由减号后面连向减号前面,边权是不等号后面的常数项

这里跑最长路,用dfs版spfa跑

#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
struct edge {
    int nxt, to, w;
} e[N << 4];
int n, m, cnt = 1;
int head[N], vis[N], d[N];
bool dfs(int u)
{
    vis[u] = 1;
    for(int i = head[u]; i; i = e[i].nxt) if(d[e[i].to] < d[u] + e[i].w)
    {
        if(vis[e[i].to]) return true;
        d[e[i].to] = d[u] + e[i].w;
        if(dfs(e[i].to)) return true;
    }
    vis[u] = 0;
    return false;
}
void link(int u, int v, int w)
{
    e[++cnt].nxt = head[u];
    head[u] = cnt;
    e[cnt].to = v;
    e[cnt].w = w;
}
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= m; ++i)
    {
        int opt, u, v, w;
        scanf("%d%d%d", &opt, &u, &v);
        if(opt == 1)
        {
            scanf("%d", &w);
            link(v, u, w);
        }
        if(opt == 2)
        {
            scanf("%d", &w);
            link(u, v, -w);
        }
        if(opt == 3)
        {
            link(u, v, 0);
            link(v, u, 0);
        }
    }
    memset(d, -0x3f3f, sizeof(d));
    for(int i = 1; i <= n; ++i)
    {
        d[i] = 0;
        if(dfs(i))
        {
            puts("No");
            return 0;
        }
    }
    puts("Yes");
    return 0;
}

时间: 2024-10-01 00:37:52

bzoj3436的相关文章

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的农场

题目链接: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的记忆有些偏差,所以他想要知道

BZOJ3436——小K的农场

1.题意:大概是给一些制约限制,问是否存在合法解 2.分析:我们来观察这三个限制 农场a比农场b至少多种植了c个单位的作物     可以变成b 比 a至多多种了-c 农场a比农场b至多多种植了c个单位的作物     可以变成a 比 b至多多种了c 农场a与农场b种植的作物数一样多 就是a = b 那么利用差分约束我们可以把这个东西转为一个图,那么如果这个图中有正环那么这个图就是不合法的,如何判断有没有正环呢? 我们可以利用spfa求最短路时判负环,我们把它改成求最长路时,判正环,然后就AC了 #

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

差分约束

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

【NOIP复习】最短路总结

[模板] 1 /*堆优化Dijkstra*/ 2 3 void dijkstra() 4 { 5 priority_queue<pair<ll,int>,vector<pair<ll,int> >,greater<pair<ll,int> > > que;//定义大顶堆 6 for (int i=1;i<=n;i++) vis[i]=0,dis[i]=INF; 7 dis[1]=0; 8 que.push(make_pair&l

YCB 的暑期计划

前言 YCB现在很弱(TAT) 暑假有一个月,赶快狂补一下. 大概的计划如下: 首先前期会以数据结构为主,毕竟代码能力太弱,涉及内容:线段树分治.二进制分组.KD-Tree. 等数据结构做到没有智商的时候加入一波数论,内容为 杜教筛.min_25筛. 然后中途小清新一下,做一些 组合博弈与构造题. 接着继续练代码能力,顺便学一些神奇的暴力:启发式合并.dsu on tree . 然后图论也忘的差不多了,就回过头去学点新东西,大概会有spfa判负环.0/1分数规划.差分约束. 估计这个时候也没有什