제출 #1107194

#제출 시각아이디문제언어결과실행 시간메모리
1107194VectorLi여행하는 상인 (APIO17_merchant)C++17
100 / 100
58 ms4244 KiB
#include <bits/stdc++.h>
#define long long long

using namespace std;

const int N = 100;
const int T = 1000;

int n, m, t;
long a[N][T], b[N][T];
long d[N][N], f[N][N];
long e[N][N];

bool valid(int x) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (i == j) {
				e[i][j] = numeric_limits<long>::min();
			} else {
				if (d[i][j] < numeric_limits<long>::max()) {
					e[i][j] = f[i][j] - d[i][j] * x;
				} else {
					e[i][j] = numeric_limits<long>::min();
				}
			}
		}
	}
	for (int k = 0; k < n; k++) {
		for (int i = 0; i < n; i++) {
			if (e[i][i] >= 0) {
				return 1;
			}
		}
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (e[i][k] > numeric_limits<int>::min() &&
					e[k][j] > numeric_limits<int>::min()) {
					e[i][j] = max(e[i][j], e[i][k] + e[k][j]);
				}
			}
		}
	}
	return 0;
}

void solve() {
	cin >> n >> m >> t;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < t; j++) {
			cin >> a[i][j] >> b[i][j];
		}
	}
	for (int i = 0; i < n; i++) {
		fill(d[i], d[i] + n, numeric_limits<long>::max());
		d[i][i] = 0;
	}
	for (int i = 0; i < m; i++) {
		int u, v;
		long w;
		cin >> u >> v >> w;
		u = u - 1, v = v - 1;
		d[u][v] = min(d[u][v], w);
	}
	for (int k = 0; k < n; k++) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (d[i][k] < numeric_limits<long>::max() &&
					d[k][j] < numeric_limits<long>::max()) {
					d[i][j] = min(d[i][j], d[i][k] + d[k][j]);	
				}
			}
		}
	}
	
	// f[i][j] 表示 i 直接到 j 最大收益是多少
	// 如果不连通,为 min
	// 否则,最小值是 0 
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (d[i][j] == numeric_limits<long>::max()) {
				f[i][j] = numeric_limits<long>::min();
			} 
			for (int k = 0; k < t; k++) {
				if (b[j][k] < 0 || a[i][k] < 0) {
					continue;
				}
				f[i][j] = max(f[i][j], b[j][k] - a[i][k]);
			}
		}
	}
	
	int l = 0, r = (int) 1E9;
	while (l <= r) {
		int c = (l + r) / 2;
		if (valid(c)) {
			l = c + 1;
		} else {
			r = c - 1;
		}
	}
	cout << r << "\n";
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(nullptr);
	solve();
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...