Submission #106229

# Submission time Handle Problem Language Result Execution time Memory
106229 2019-04-17T13:37:39 Z polyfish Travelling Merchant (APIO17_merchant) C++14
100 / 100
111 ms 3260 KB
//Pantyhose(black) + glasses = infinity
 
#include <bits/stdc++.h>
using namespace std;
 
#define debug(x) cerr << #x << " = " << x << '\n';
#define BP() cerr << "OK!\n";
#define PR(A, n) {cerr << #A << " = "; for (int64_t _=1; _<=n; ++_) cerr << A[_] << ' '; cerr << '\n';}
#define PR0(A, n) {cerr << #A << " = "; for (int64_t _=0; _<n; ++_) cerr << A[_] << ' '; cerr << '\n';}
#define FILE_NAME "merchant"
 
const int64_t MAX_N = 102;
const int64_t MAX_K = 1002;
const int64_t INF = 1e9+1e8;
const int64_t _EPS = 1e-8;
 
struct edge {
	int64_t u, v;
	int64_t w;
 
	edge() {}
 
	edge(int64_t u, int64_t v, int64_t w): u(u), v(v), w(w) {}
};
 
int64_t n, m, k, b[MAX_N][MAX_K], s[MAX_N][MAX_K], c[MAX_N][MAX_N], mx[MAX_N][MAX_N];
int64_t topo[MAX_N], timer;
bool visited[MAX_N];
vector<edge> g[MAX_N]; 
int64_t d[MAX_N];
 
void read_input() {
	cin >> n >> m >> k;
 
	for (int64_t i=1; i<=n; ++i) {
		for (int64_t j=1; j<=k; ++j)
			cin >> b[i][j] >> s[i][j];
	}
}
 
void floyd() {
	for (int64_t i=1; i<=n; ++i) {
		for (int64_t j=1; j<=n; ++j)
			c[i][j] = INF;
	}
 
	for (int64_t i=1; i<=n; ++i)
		c[i][i] = 0;
 
	for (int64_t i=1; i<=m; ++i) {
		int64_t u, v;
		cin >> u >> v;
		cin >> c[u][v];
	}
 
	for (int64_t k=1; k<=n; ++k) {
		for (int64_t i=1; i<=n; ++i) {
			for (int64_t j=1; j<=n; ++j)
				c[i][j] = min(c[i][j], c[i][k] + c[k][j]);
		}
	}
 
	// debug(c[4][1]);
}
 
void init() {
	for (int64_t i=1; i<=n; ++i) {
		for (int64_t j=1; j<=n; ++j) {
			mx[i][j] = -INF;
 
			for (int64_t t=1; t<=k; ++t) {
				if (b[i][t]!=-1 && s[j][t]!=-1)
					mx[i][j] = max(mx[i][j], -b[i][t] + s[j][t]);
			}
		}
	}
 
	// debug(mx[1][4]);
}
 
bool relax(edge e) {
	if (abs(d[e.v] - d[e.u] - e.w)>_EPS && d[e.v] > d[e.u] + e.w) {
		d[e.v] = d[e.u] + e.w;
		return true;
	}
 
	return false;
}
 
int detect_zero_cycle(int u) {
	visited[u] = true;

	for (auto e : g[u]) {
		if (abs(d[e.v] - d[e.u] - e.w)<=_EPS && !visited[e.v])
			detect_zero_cycle(e.v);
	}

	topo[u] = ++timer;
}

bool check_negative_cycle(int64_t x) {
	vector<edge> E;
 
	for (int64_t i=1; i<=n; ++i) {
		g[i].clear();

		for (int64_t j=1; j<=n; ++j) {
			// if (i==4 && j==1)
			// 	debug(x*c[i][j] - max((int64_t)0, mx[i][j]));
			if (i!=j) {
				E.push_back(edge(i, j, x*c[i][j] - max((int64_t)0, mx[i][j])));
				g[i].push_back(edge(i, j, x*c[i][j] - max((int64_t)0, mx[i][j])));
			}
		}
	}
 
	memset(d, 0, sizeof(d));
 
	for (int64_t i=0; i<=n; ++i) {
		if (i==n)
			return true;
 
		bool stop = true;
 
		for (auto e : E) {
			if (relax(e))
				stop = false;
		}
 
		if (stop)
			break;
	}

	// debug(detect_zero_cycle(1, 1));

	memset(visited, false, sizeof(visited));
	timer = 0;

	for (int i=1; i<=n; ++i) {
		if (!visited[i])
			detect_zero_cycle(i);
	}
 
	for (int u=1; u<=n; ++u) {
		for (auto e : g[u]) {
			if (abs(d[e.v] - d[e.u] - e.w)<=_EPS && topo[u]<topo[e.v])
				return true;
		}
	}

	return false;
}
 
int64_t bisect() {
	int64_t l = 0, r = INF;

	for (int64_t mid=(l+r)/2; mid!=l && r!=mid; mid=(l+r)/2) {
		if (check_negative_cycle(mid))
			l = mid;
		else
			r = mid;
	}

	for (int64_t i=r; i>=l; --i) {
		if (check_negative_cycle(i))
			return i;
	}
 
 	return 0;
}
 
int main() {
	ios::sync_with_stdio(0); cin.tie(0);
 
	read_input();
	floyd();
	init();
	// debug(check_negative_cycle(2));
	cout << int64_t(bisect());
}

Compilation message

merchant.cpp: In function 'int detect_zero_cycle(int)':
merchant.cpp:99:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
# Verdict Execution time Memory Grader output
1 Correct 60 ms 3260 KB Output is correct
2 Correct 24 ms 2336 KB Output is correct
3 Correct 70 ms 2304 KB Output is correct
4 Correct 8 ms 1160 KB Output is correct
5 Correct 9 ms 1136 KB Output is correct
6 Correct 5 ms 1176 KB Output is correct
7 Correct 14 ms 1168 KB Output is correct
8 Correct 3 ms 384 KB Output is correct
9 Correct 14 ms 1160 KB Output is correct
10 Correct 8 ms 1144 KB Output is correct
11 Correct 9 ms 1128 KB Output is correct
12 Correct 3 ms 512 KB Output is correct
13 Correct 8 ms 1176 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 1152 KB Output is correct
2 Correct 9 ms 1176 KB Output is correct
3 Correct 8 ms 1156 KB Output is correct
4 Correct 8 ms 1188 KB Output is correct
5 Correct 12 ms 1184 KB Output is correct
6 Correct 2 ms 384 KB Output is correct
7 Correct 7 ms 1144 KB Output is correct
8 Correct 9 ms 1208 KB Output is correct
9 Correct 7 ms 1144 KB Output is correct
10 Correct 12 ms 1160 KB Output is correct
11 Correct 10 ms 1208 KB Output is correct
12 Correct 11 ms 1208 KB Output is correct
13 Correct 9 ms 1168 KB Output is correct
14 Correct 11 ms 1184 KB Output is correct
15 Correct 9 ms 1168 KB Output is correct
16 Correct 9 ms 1144 KB Output is correct
17 Correct 11 ms 1216 KB Output is correct
18 Correct 3 ms 384 KB Output is correct
19 Correct 10 ms 1168 KB Output is correct
20 Correct 8 ms 1208 KB Output is correct
21 Correct 11 ms 1180 KB Output is correct
22 Correct 10 ms 1176 KB Output is correct
23 Correct 9 ms 1128 KB Output is correct
24 Correct 5 ms 1176 KB Output is correct
25 Correct 14 ms 1168 KB Output is correct
26 Correct 3 ms 384 KB Output is correct
27 Correct 14 ms 1160 KB Output is correct
28 Correct 8 ms 1144 KB Output is correct
29 Correct 9 ms 1128 KB Output is correct
30 Correct 3 ms 512 KB Output is correct
31 Correct 8 ms 1176 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 34 ms 2472 KB Output is correct
2 Correct 111 ms 3240 KB Output is correct
3 Correct 39 ms 2436 KB Output is correct
4 Correct 32 ms 2476 KB Output is correct
5 Correct 53 ms 2484 KB Output is correct
6 Correct 52 ms 2368 KB Output is correct
7 Correct 11 ms 1216 KB Output is correct
8 Correct 3 ms 384 KB Output is correct
9 Correct 10 ms 1168 KB Output is correct
10 Correct 8 ms 1208 KB Output is correct
11 Correct 11 ms 1180 KB Output is correct
12 Correct 10 ms 1176 KB Output is correct
13 Correct 9 ms 1128 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 1152 KB Output is correct
2 Correct 9 ms 1176 KB Output is correct
3 Correct 8 ms 1156 KB Output is correct
4 Correct 8 ms 1188 KB Output is correct
5 Correct 12 ms 1184 KB Output is correct
6 Correct 2 ms 384 KB Output is correct
7 Correct 7 ms 1144 KB Output is correct
8 Correct 9 ms 1208 KB Output is correct
9 Correct 7 ms 1144 KB Output is correct
10 Correct 12 ms 1160 KB Output is correct
11 Correct 10 ms 1208 KB Output is correct
12 Correct 11 ms 1208 KB Output is correct
13 Correct 9 ms 1168 KB Output is correct
14 Correct 11 ms 1184 KB Output is correct
15 Correct 9 ms 1168 KB Output is correct
16 Correct 9 ms 1144 KB Output is correct
17 Correct 34 ms 2472 KB Output is correct
18 Correct 111 ms 3240 KB Output is correct
19 Correct 39 ms 2436 KB Output is correct
20 Correct 32 ms 2476 KB Output is correct
21 Correct 53 ms 2484 KB Output is correct
22 Correct 52 ms 2368 KB Output is correct
23 Correct 11 ms 1216 KB Output is correct
24 Correct 3 ms 384 KB Output is correct
25 Correct 10 ms 1168 KB Output is correct
26 Correct 8 ms 1208 KB Output is correct
27 Correct 11 ms 1180 KB Output is correct
28 Correct 10 ms 1176 KB Output is correct
29 Correct 9 ms 1128 KB Output is correct
30 Correct 43 ms 2344 KB Output is correct
31 Correct 51 ms 2576 KB Output is correct
32 Correct 54 ms 3064 KB Output is correct
33 Correct 53 ms 2536 KB Output is correct
34 Correct 40 ms 2472 KB Output is correct
35 Correct 43 ms 2472 KB Output is correct
36 Correct 85 ms 3160 KB Output is correct
37 Correct 2 ms 384 KB Output is correct
38 Correct 3 ms 384 KB Output is correct
39 Correct 41 ms 2328 KB Output is correct
40 Correct 29 ms 2320 KB Output is correct
41 Correct 33 ms 2376 KB Output is correct
42 Correct 38 ms 2396 KB Output is correct
43 Correct 37 ms 2320 KB Output is correct
44 Correct 2 ms 384 KB Output is correct
45 Correct 9 ms 1208 KB Output is correct
46 Correct 11 ms 1216 KB Output is correct
47 Correct 10 ms 1208 KB Output is correct
48 Correct 88 ms 3064 KB Output is correct
49 Correct 93 ms 3092 KB Output is correct
50 Correct 2 ms 384 KB Output is correct
51 Correct 60 ms 3260 KB Output is correct
52 Correct 24 ms 2336 KB Output is correct
53 Correct 70 ms 2304 KB Output is correct
54 Correct 8 ms 1160 KB Output is correct
55 Correct 9 ms 1136 KB Output is correct
56 Correct 5 ms 1176 KB Output is correct
57 Correct 14 ms 1168 KB Output is correct
58 Correct 3 ms 384 KB Output is correct
59 Correct 14 ms 1160 KB Output is correct
60 Correct 8 ms 1144 KB Output is correct
61 Correct 9 ms 1128 KB Output is correct
62 Correct 3 ms 512 KB Output is correct
63 Correct 8 ms 1176 KB Output is correct