제출 #1358759

#제출 시각아이디문제언어결과실행 시간메모리
1358759peteza여행하는 상인 (APIO17_merchant)C++20
0 / 100
194 ms2184 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;

ll n, m, k, l, r=1e9+7, mid,a,bb,c;
vector<pii> adj[105];
ll b[105][1005], s[105][1005];
ll od[105][105], nd[105][105];

int main() {
	cin >> n >> m >> k;
	for(int i=1;i<=n;i++) {
		for(int ck=0;ck<k;ck++) {
			cin >> b[i][ck] >> s[i][ck];
		}
		for(int j=1;j<=n;j++) od[i][j]=4e9;
		od[i][i]=0;
	}
	while(m--) {
		cin >> a >> bb >> c;
		od[a][bb]=c;
		adj[a].emplace_back(bb, c);
	}
	for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
		od[i][j] = min(od[i][j], od[i][k]+od[k][j]);
	while(l < r) {
		mid = (l+r)>>1;
		for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) {
			nd[i][j]=0;
			for(int ck=0;ck<k;ck++) {
				if(b[i][ck]==-1||s[j][ck]==-1) continue;
				nd[i][j]=max(nd[i][j], s[j][ck]-b[i][ck]);
			}
			nd[i][j]=od[i][j]*mid-nd[i][j];
		}
		for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
			nd[i][j] = min(nd[i][j], nd[i][k]+nd[k][j]);
		bool yess=0;
		//for(int i=1;i<=n;i++) yess |= (nd[i][i]<0);
		for(int i=1;i<=n;i++) {
			for(auto [dest,dist]:adj[i]) {
				yess |= (dist+nd[dest][i]<=0);
			}
		}
		if(yess) l = mid+1;
		else r = mid;
	}
	cout << r-1;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…