水题,英语水平太低,题意理解错了,QAQ
汽车是有最高电量的,每到一个学校是加满油到ans值,而不是+ans。任意一个学校到另一个,路上充电次数不能超过k次,问一个学校的充电站最少可以放多少电量。
思路:二分电量,跑floyd判充电次数。
代码:
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
typedef long long ll;
const ll inf = 0x3f3f3f3f3f3f3f3f;
const ll maxv = 111;
ll T, n, k, m, mp[maxv][maxv], gi[maxv][maxv], A;
ll check(ll x)
{
for (ll i = 0; i < n; i++)
{
for (ll j = 0; j < n; j++)
{
if (i == j)
{
gi[i][i] = 0;
}
else if (mp[i][j] <= x)
{
gi[i][j] = 1;
}
else
{
gi[i][j] = inf;
}
}
}
for (ll i = 0; i < n; i++)
{
for (ll j = 0; j < n; j++)
{
for (ll k = 0; k < n; k++)
{
gi[j][k] = min(gi[j][k], gi[j][i] + gi[i][k]);
}
}
}
for (ll i = 0; i < n; i++)
{
for (ll j = 0; j < n; j++)
{
if (gi[i][j] > k)
return 0;
}
}
return 1;
}
int main()
{
scanf("%lld", &T);
while (T--)
{
A = 0;
scanf("%lld %lld %lld", &n, &k, &m);
memset(mp, inf, sizeof(mp));
for (ll i = 1; i <= m; i++)
{
ll a, b, c;
scanf("%lld %lld %lld", &a, &b, &c);
mp[a][b] = mp[b][a] = c;
}
for (ll i = 0; i < n; i++)
{
for (ll j = 0; j < n; j++)
{
for (ll k = 0; k < n; k++)
{
mp[j][k] = min(mp[j][k], mp[j][i] + mp[i][k]);
}
}
}
ll l = 1, r = inf;
while (l <= r)
{
ll mid = (l + r) / 2;
if (check(mid))
{
r = mid - 1;
A = mid;
}
else
{
l = mid + 1;
}
}
printf("%lld\n", A);
}
return 0;
}