堪称最大连续字段和的图论版本 链接https://www.luogu.com.cn/problem/P1115
有向无环图,那么我们可以用拓扑排序,在删边的时候状态转移。 f[v] = max(f[u] + w, f[v]) ans最小设为0,ans = max(ans, f[v])
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e4 + 10;
vector<vector<pair<int, int>>>g;
int ans, in[N], f[N];
void solve()
{
ans = 0;
int n, m; cin >> n >> m;
g.clear(); g.resize(n + 1);
memset(f, 0, sizeof f);
memset(in, 0, sizeof in);
while(m --)
{
int u, v, w; cin >> u >> v >> w;
g[u].push_back({v, w});
in[v] ++;
}
queue<int>q;
for(int i = 0; i < n; i ++) if(!in[i]) q.push(i);
while(q.size())
{
int u = q.front();
q.pop();
for(auto i : g[u])
{
int v = i.first, w = i.second;
in[v] --;
f[v] = max(f[v], f[u] + w);
ans = max(ans, f[v]);
if(!in[v]) q.push(v);
}
}
cout << ans << '\n';
}
/*
1
3 2
0 1 -10
1 2 20
*/
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int t = 1; cin >> t;
while(t --) solve();
}