洛谷P1250 種樹 題解 差分約束求最小解集

題目鏈接: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章