22.网络提速(最短路)
时间限制: 1 s
题目描述
某学校的校园网由n(1<=n<=50)台计算机组成,计算机之间由网线相连,如图5。其中顶点代表计算机,边代表网线。正如你所见,不同网线的传输能力不尽相同,例如计算机1与计算机2之间传输信息需要34秒,而计算机2与计算机3之间的传输信息只要10秒。计算机1与计算机5之间传输信息需要44秒,途径为机1到机3到机5。
现学校购买了m(1<=m<=10)台加速设备,每台设备可作用于一条网线,使网线上传输信息用时减半。多台设备可用于同一条网线,其效果叠加,即用两台设备,用时为原来的1/4,用三台设备,用时为原来的1/8。如何合理使用这些设备,使计算机1到计算机n传输用时最少,这个问题急需解决。校方请你编程解决这个问题。例如图5,若m=2,则将两台设备分别用于1-3,3-5的线路,传输用时可减少为22秒,这是最佳解。
输入描述
第一行先输入n,m。以下n行,每行有n个实数。第i行第j列的数为计算机i与计算机j之间网线的传输用时,0表示它们之间没有网线连接。注意输入数据中,从计算机1到计算机n至少有一条网路。
输出描述
输出计算机1与计算机n之间传输信息的最短时间。(保留两位小数)
样例输入
5
0
34
24
0
0
样例输出
22.00
数据范围及提示
分类标签
思路:先找出1—n的最短路,再从最短路上,从边的权值的大到小顺序除二知道m==0为止
代码:
#include
using namespace std;
const int maxn=51;
#include
#include
#include
int n,m,p[maxn][maxn],dist[maxn],pre[maxn],visit[maxn]={0},t=0;
double sum=0;
struct Edge{
};
Edge edge[maxn*maxn];//存最短路径的边
void input();
void dijkstra();
int cmp(const Edge &a,const Edge &b)
{
}
void stim()
{
}
int main()
{
}
void dijkstra()
{
}
void input()
{
}