首页 > 其他分享 >洛谷-P1250 种树

洛谷-P1250 种树

时间:2024-08-13 22:05:49浏览次数:15  
标签:洛谷 P1250 int graph ++ edge 种树 dist maxn

Abstract

传送门

Idea

显然是一个差分约束系统。不妨用 dist[i] 表示前 i 个位置种的树的数目,那么,容易得出下列方程:

  1. dist[i] >= dist[i-1]
  2. dist[i] - dist[i-1] <= 1 (每个位置至多能种一颗树)

题目要求 b 到 e 之间至少种 t 棵树,其数学形式就是:

  1. dist[b] - dist[e-1] >= t

依据上面三种方程,我们构建了一个完整的差分约束系统,接下来跑最短路求出 dist 数组的一个可能取值就行了。然后,考虑到边界条件 dist[0] = 0,所以答案是 dist[n] - dist[0] 。

Code

#include <bits/stdc++.h>
using namespace std;
int n, h;
namespace graph
{
    const int maxn = 100000;
    int head[maxn];
    int cnt;
    struct Edge
    {
        int next, to, value;
    } edge[maxn];
    void add(int u, int v, int c)
    {
        edge[++cnt].next = head[u];
        edge[cnt].to = v;
        edge[cnt].value = c;
        head[u] = cnt;
        return;
    }
};

bool SPFA(int start, int dist[])
{
    queue<int> q;
    bool inQueue[graph::maxn] = {false};
    int count[graph::maxn] = {0};
    for (int i = 1; i < n + 1; i++)
    {
        dist[i] = 0x3f3f3f3f;
    }
    dist[start] = 0;
    q.push(start);
    inQueue[start] = true;
    count[start] = 1;

    while (!q.empty())
    {
        int u = q.front();
        q.pop();
        inQueue[u] = false;

        for (int i = graph::head[u]; i; i = graph::edge[i].next)
        {
            int v = graph::edge[i].to;
            int w = graph::edge[i].value;
            if (dist[u] + w < dist[v])
            {
                dist[v] = dist[u] + w;
                if (!inQueue[v])
                {
                    q.push(v);
                    inQueue[v] = true;
                    count[v]++;
                }
                if (count[v] > n + 1)
                {
                    return true;
                }
            }
        }
    }
    return false;
}

void solve()
{
    cin >> n >> h;
    for (int i = 0; i < h; i++)
    {

        int e, b, t;
        cin >> b >> e >> t;
        graph::add(e, b - 1, -t);
    }

    for (int i = 0; i < n; i++)
    {
        graph::add(i, i + 1, 1);
        graph::add(i + 1, i, 0);
    }
    for (int i = 0; i < n + 1; i++)
    {
        graph::add(n + 1, i, 0);
    }

    int dist[graph::maxn];
    SPFA(n + 1, dist);
    cout << dist[n] - dist[0];
    return;
}

signed main()
{
    int t = 1;
    while (t--)
    {
        solve();
    }
    return 0;
}

标签:洛谷,P1250,int,graph,++,edge,种树,dist,maxn
From: https://www.cnblogs.com/carboxylBase/p/18357800

相关文章

  • 洛谷P2758编辑距离超详注解
    注:本蒟蒻第一篇题解本文亦发表于洛谷博客题目跳转题目大意用最少的字符操作次数,将字符串A转换为字符串B。字符操作为:1.删除一个字符;2.插入一个字符;3.将一个字符改为另一个字符。代码思路本题很明显用的是DP1.赋值将dp数组的值赋值到最大2.特殊赋值对......
  • 洛谷美化教程
    洛谷那界面太丑了,给大家推荐美化教程edge用户下载篡改猴。Google自行摸索。。。下载UP给的扩展包密码CSDN私聊edge访问:thisgoogle访问:this注意:edge用户请打开拖拽下载的文件进入安装扩展edge和Google会提示安装篡改猴生效图片:背景颜色可打开篡改猴自行修改......
  • 洛谷题单指南-常见优化技巧-P1638 逛画展
    原题链接:https://www.luogu.com.cn/problem/P1638题意解读:在n个数中,选出a、b两个端点,使得a~b之间不同的数字为m,且b-a最小。解题思路:要寻找最小的包括所有数字的区间,可以采用双指针算法1、设i,j分别是左右指针2、如果当前区间内不同数字个数不到m,j往后移3、记录数字个数到m时......
  • 洛谷 P4305 不重复数字——题解
    洛谷P4305题解传送锚点摸鱼环节[JLOI2011]不重复数字题目描述给定\(n\)个数,要求把其中重复的去掉,只保留第一次出现的数。输入格式本题有多组数据。第一行一个整数\(T\),表示数据组数。对于每组数据:第一行一个整数\(n\)。第二行\(n\)个数,表示给定的数。输出格......
  • 洛谷 P4556 雨天的尾巴之线段树合并模板
    洛谷P4556题解传送锚点摸鱼环节[Vani有约会]雨天的尾巴/【模板】线段树合并题目背景深绘里一直很讨厌雨天。灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切。虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以......
  • 洛谷 P1560 [USACO5.2]蜗牛的旅行Snail Trails(c++)
    describe蜗牛在制定今天的旅游计划,有n个景点可选,它已经把这些景点按照顺路游览的顺序排成一排了,每个地方有相应的景观,这里用一个整数表示。蜗牛希望选取连续的一段景点,还要选出来的每一个景点的景观都不同,问它最多能选出多少个景点进行旅游。#include<iostream>#inc......
  • l洛谷 P7870 兔已着陆——题解
    洛谷P7870题解传送锚点摸鱼环节「Wdoi-4」兔已着陆题目背景铃瑚和清兰是从月之都到达幻想乡的两只月兔。正因为降落到了幻想乡进行调查,因此她们通过开团子屋制作团子出售的方式,在幻想乡生活。为了应对越发繁荣的市场,她们向河城荷取购置了一台团子机器,可以高效地生产出五颜......
  • 洛谷 4道水题 题解(字符串入门)
    题目目录:No.1 B2109统计数字字符个数 No.2 B2110找第一个只出现一次的字符 No.3 B2111基因相关性No.4 B2113输出亲朋字符串OK开始正文!第一题:B2109统计数字字符个数题目描述输入一行字符,统计出其中数字字符的个数。输入格式一行字符串,总长度不超过 255。......
  • 洛谷 P10852 Awaken——题解
    洛谷P10852题解传送锚点摸鱼环节【MX-X2-T1】「CfzRound4」Awaken题目背景能否等到梦醒了的时候。题目描述月做了一个梦。在梦中,她拿到了一个长度为\(n\)的整数序列\(a_1,\ldots,a_n\),其中\(\bm{n\ge5}\)。梦醒了。月忘记了这个序列中的一部分元素,留下了空白......
  • 洛谷 CF896C Willem, Chtholly and Seniorious之珂朵莉树板子
    洛谷CF896C题解传送锚点摸鱼环节Willem,ChthollyandSeniorious题面翻译【题面】请你写一种奇怪的数据结构,支持:\(1\)\(l\)\(r\)\(x\):将\([l,r]\)区间所有数加上\(x\)\(2\)\(l\)\(r\)\(x\):将\([l,r]\)区间所有数改成\(x\)\(3\)\(l\)\(r\)\(x\):输出将\(......