洛谷P1250 种树 题解 差分约束求最小解集

发布时间 2024-01-09 12:28:52作者: quanjun

题目链接:https://www.luogu.com.cn/problem/P1250

题目大意:略

解题思路:差分约束 求 最长路。

关于为什么求最长路可以看一下这边博客:《关于差分约束系统中跑最长路还是最短路的澄清》

博客的核心思想就是一句话:

要想求最小解集跑最长路;要想求最大解集跑最短路。

这也加深了我对差分约束问题的理解。

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e4 + 5;
struct Edge { int v, w; };
vector<Edge> g[maxn];
int T, n, m;

int dis[maxn];
bool inq[maxn];

void spfa() {
    queue<int> que;
    memset(dis, -1, sizeof(int)*(n+1));
    dis[0] = 0;
    que.push(0);
    while (!que.empty()) {
        int u = que.front();
        que.pop();
        inq[u] = false;
        for (auto e : g[u]) {
            int v = e.v, w = e.w;
            if (dis[v] < dis[u] + w) {
                dis[v] = dis[u] + w;
                if (!inq[v])
                    inq[v] = true, que.push(v);
            }
        }
    }
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; i++) {
        int b, e, t;
        scanf("%d%d%d", &b, &e, &t);
        g[b-1].push_back({e, t});
    }
    for (int i = 1; i <= n; i++)
        g[i-1].push_back({i, 0}),
        g[i].push_back({i-1, -1});
	spfa();
	printf("%d\n", dis[n]);
    return 0;
}