给定
不难发现问题可以转化为,我们要选择一个点,求使得这个点能够到达其它所有点的最大代价,然后求所有起点最大代价的最小值,这东西有点像全源最短路,且数据范围很小。于是不难想到一步转化,可以将原不等式转化为
xxxxxxxxxx
661
2
3
4
5
6
7
8
9
10
11using namespace std;
12
13mt19937 rnd(random_device{}());
14int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
15bool rnddd(int x){return rndd(1, 100) <= x;}
16
17typedef unsigned int uint;
18typedef unsigned long long unll;
19typedef long long ll;
20typedef long double ld;
21
22template < typename T = int >
23inline T read(void);
24
25int N;
26struct Node{ll x, y, p;}nod[300];
27ll dis[300][300];
28ll ans(LONG_LONG_MAX);
29
30int main(){
31 N = read();
32 for(int i = 1; i <= N; ++i)nod[i].x = read(), nod[i].y = read(), nod[i].p = read();
33 for(int i = 1; i <= N; ++i)
34 for(int j = 1; j <= N; ++j)
35 if(i == j)dis[i][j] = 0;
36 else
37 dis[i][j] = (ll)ceil((ld)(abs(nod[i].x - nod[j].x) + abs(nod[i].y - nod[j].y)) / (ld)nod[i].p),
38 dis[j][i] = (ll)ceil((ld)(abs(nod[i].x - nod[j].x) + abs(nod[i].y - nod[j].y)) / (ld)nod[j].p);
39 for(int k = 1; k <= N; ++k)
40 for(int i = 1; i <= N; ++i)
41 for(int j = 1; j <= N; ++j)
42 dis[i][j] = min(dis[i][j], max(dis[i][k], dis[k][j]));
43 for(int s = 1; s <= N; ++s){
44 ll mx(-1);
45 for(int t = 1; t <= N; ++t)mx = max(mx, dis[s][t]);
46 ans = min(ans, mx);
47 }printf("%lld\n", ans);
48 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
49 return 0;
50}
51
52template < typename T >
53inline T read(void){
54 T ret(0);
55 int flag(1);
56 char c = getchar();
57 while(c != '-' && !isdigit(c))c = getchar();
58 if(c == '-')flag = -1, c = getchar();
59 while(isdigit(c)){
60 ret *= 10;
61 ret += int(c - '0');
62 c = getchar();
63 }
64 ret *= flag;
65 return ret;
66}
update-2022_12_09 初稿