0分求助
查看原帖
0分求助
1393897
x11223344楼主2025/2/6 11:10
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 260;
#define ll long long
struct mar
{
	ll a[N][N];
	mar() { memset(a, 0xcf, sizeof(a)); }
	mar operator*(mar b)
	{
		mar ans;
		for (int i = 1; i < N; i++)
			for (int j = 1; j < N; j++)
				for (int k = 1; k < N; k++) ans.a[i][j] = max(ans.a[i][j], a[i][k] + b.a[k][j]);
		return ans;
	}
} r[35];
struct Node { int t, u, v; } a[N];
bool cmp(Node a, Node b) { return a.t < b.t; }
ll b[N], dp[N][2];
int now = 0, pre = 1;
void solve(int x)
{
	for (int i = 0; i <= 30; i++)
		if (x & (1 << i) != 0)
		{
			swap(now, pre);
			for (int j = 1; j < N; j++) dp[j][now] = 0xcfcfcfcfcfcfcfcf;
			for (int j = 1; j < N; j++)
				for (int k = 1; k < N; k++) dp[j][now] = max(dp[j][now], dp[k][pre] + r[i].a[j][k]);
		}
}
int main()
{
	int n, m, t, k;
	cin >> n >> m >> t >> k;
	for (int i = 1; i <= n; i++) cin >> b[i];
	for (int i = 1; i <= m; i++)
	{
		int u, v, w;
		cin >> u >> v >> w;
		r[0].a[4 * n + v][(5 - w) * n + u] = b[v];
	}
	for (int i = 1; i <= k; i++) cin >> a[i].t >> a[i].u >> a[i].v;
	sort(a + 1, a + k + 1, cmp);
	for (int i = 0; i < 4; i++)
		for (int j = 1; j <= n; j++) r[0].a[i * n + j][(i + 1) * n + j] = 0;
	for (int i = 1; i <= 30; i++) r[i] = r[i - 1] * r[i - 1];
	memset(dp, 0xcf, sizeof(dp));
	dp[4 * n + 1][0] = b[1];
	for (int i = 1; i <= k; i++)
	{
		int x = a[i].t - a[i - 1].t;
		solve(x);
		dp[4 * n + a[i].u][now] += a[i].v;
	}
	solve(t - a[k].t);
	if (dp[4 * n + 1][now] < 0) cout << "-1" << endl;
	else cout << dp[4 * n + 1][now] << endl;
	return 0;
}

注:样例就输出了一个很奇怪的数。

2025/2/6 11:10
加载中...