CSUOJ Bones’s Battery(二分)(floyd)

2023-10-25 04:38
文章标签 二分 floyd battery csuoj bones

本文主要是介绍CSUOJ Bones’s Battery(二分)(floyd),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1817: Bones’s Battery

Submit Page    Summary    Time Limit: 5 Sec     Memory Limit: 256 Mb     Submitted: 224     Solved: 68    


Description

    Bones is investigating what electric shuttle is appropriate for his mom’s school district vehicle. Each school has a charging station. It is important that a trip from one school to any other be completed with no more than K rechargings. The car is initially at zero battery and must always be recharged at the start of each trip; this counts as one of the K rechargings. There is at most one road between each pair of schools, and there is at least one path of roads connecting each pair of schools. Given the layout of these roads and K, compute the necessary range required of the electric shuttle.

Input

Input begins with a line with one integer T (1 ≤ T ≤ 50) denoting the number of test cases. Each test case begins with a line containing three integers N, K, and M (2 ≤ N ≤ 100, 1 ≤ K ≤ 100), where N denotes the number of schools, K denotes the maximum number of rechargings permitted per trip, and M denotes the number of roads. Next follow M lines each with three integers ui, vi, and di (0 ≤ ui, vi < N, ui ≠ vi, 1 ≤ di ≤ 109) indicating that road i connects schools ui and vi (0-indexed) bidirectionally with distance di.

Output

For each test case, output one line containing the minimum range required.

Sample Input

2
4 2 4
0 1 100
1 2 200
2 3 300
3 0 400
10 2 15
0 1 113
1 2 314
2 3 271
3 4 141
4 0 173
5 7 235
7 9 979
9 6 402
6 8 431
8 5 462
0 5 411
1 6 855
2 7 921
3 8 355
4 9 113

Sample Output

300
688

 

 

题意:有几个点,每个点之间有一个路程(其实是所需要的电量),保证整张图联通,然后有t次充电的机会,在每一个点都可以选择充满电,但最多充t次电,现在要保证任意每两个点之间都可以相互到达,问电池总容量最小为多少。

这道题本来看样例以为是最短路,想了半天不知道怎么把最短路和电池充电次数联系起来,给于大佬讲了题意之后,于大佬点出可以用二分呀,这才想起来之前monthly spent那道题里的FJ计算最小月花费的二分算法。

先在整张图跑一遍floyd,找出两点之间的最短路,然后开始二分。每次尝试的x值都要开一个新的数组dis,然后如果两点之间的最短路小于x,说明一次充满电可以跑完这两点,在dis中记为1,否则记为inf。

然后在dis中再跑一遍floyd。

如果结果的dis中发现有两点之间需要大于t次充电才能达到的地方说明x不满足,否则x是满足的。

这道题卡了有40分钟,一直以为是二分好久不写了,最后取得的mid那里有bug,一直调,还是WA。最后将ing从0x3f3f3f3f改成了1e9就过了,看来这道题会卡100000000,0x3f3f3f3还是不够大,尤其是这里用开了longlong的情况。

 

 

#include<iostream>
#include<stdio.h>
#include<cstring>
#include <cstring>
#define M 10
#define inf 10000000000
using namespace std;long long m[115][115];bool qwewqtrwet(long long x,int time,int n)
{long long dis[115][115];memset(dis,0,sizeof(dis));//for(int k=1;k<=n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(i!=j){if(m[i][j]<=x)dis[i][j]=1;elsedis[i][j]=inf;}elsedis[i][j]=0;for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(i!=j&&i!=k&&j!=k)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(dis[i][j]>time) return 0;return 1;
}int main()
{int casen;scanf("%d",&casen);while(casen--){memset(m,0,sizeof(m));int n,k,road;long long low=0,high=inf;scanf("%d%d%d",&n,&k,&road);for(int i=0;i<n;i++)for(int j=0;j<n;j++)m[i][j]=inf;for(int i=0;i<n;i++)m[i][i]=0;for(int i=0;i<road;i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);high+=z;m[x][y]=z;m[y][x]=z;}for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(i!=j&&i!=k&&j!=k)m[i][j]=min(m[i][j],m[i][k]+m[k][j]);while(low!=high){long long  mid=(low+high)>>1;if(qwewqtrwet(mid,k,n))  high=mid;else low=mid+1;}cout<<low<<endl;}return 0;
}

 

这篇关于CSUOJ Bones’s Battery(二分)(floyd)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/280072

相关文章

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

uva 10099(floyd变式)

题意: 有一个导游要带着一群旅客从一个城市到达另一个城市,每个城市之间有最大的旅客流量限制。 问最少几趟能将这些旅客从一个城市搞到另一个城市。 解析: 用floyd找出最小流量中的最大边,然后次数就是   ceil(总人数 / 最大承载量 - 1),-1的意思是导游每次也要在车上。 ps.老司机哭晕在厕所 代码: #include <iostream>#includ

uva 10048(floyd变式)

题意: 求两个点之间经过的路径中最大噪声最小的值。 解析: floyd的变式,每次取g[i][k] g[k][j]中的大边与当前边g[i][j]比较,取小。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#includ

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

poj 3104 二分答案

题意: n件湿度为num的衣服,每秒钟自己可以蒸发掉1个湿度。 然而如果使用了暖炉,每秒可以烧掉k个湿度,但不计算蒸发了。 现在问这么多的衣服,怎么烧事件最短。 解析: 二分答案咯。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <c

poj 3258 二分最小值最大

题意: 有一些石头排成一条线,第一个和最后一个不能去掉。 其余的共可以去掉m块,要使去掉后石头间距的最小值最大。 解析: 二分石头,最小值最大。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <c

poj 2594 二分图最大独立集

题意: 求一张图的最大独立集,这题不同的地方在于,间接相邻的点也可以有一条边,所以用floyd来把间接相邻的边也连起来。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <sta

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大