网络提速(最短路)

codevs——1243 网络提速

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 黄金 Gold

题解

题目描述 Description

某学校的校园网由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秒,这是最佳解。

输入描述 Input Description

第一行先输入n,m。以下n行,每行有n个实数。第i行第j列的数为计算机i与计算机j之间网线的传输用时,0表示它们之间没有网线连接。注意输入数据中,从计算机1到计算机n至少有一条网路。

输出描述 Output Description

输出计算机1与计算机n之间传输信息的最短时间。(保留两位小数)

样例输入 Sample Input

5 2

0 34 24 0 0

34 0 10 12 0

24 10 0 16 20

0 12 16 0 30

0 0 20 30 0

样例输出 Sample Output

22.00

思路:先对整体进行处理,然后跑一遍最短路(我用的是spfa),在这个spfa中加上dp来解决这道题。

首先:我们在这里存边的时候我们使用的是一个三维数组,用a[i][j][0]存我们输入的每条边的边权。

从a[i][j][1]到a[i][j][k]存的是我们如果在这条边上使用k个加速器后产生的效果。(当然,里面边不相连的权值赋成极大值,这样就方便我们后面用来跑spfa)

然后这样我们就把一个比较复杂的问题转化成了一个比较简单的问题了。

对于这个问题我们就可以看作一个简单的spfa了。

但是别高兴的太早,我们并不是就这个样子就可以A掉这个题的哦,我们还要再加一点东西。

注意:spfa里面跑的是三重循环,第一重循环跑起点,第二重循环跑的是使用的加速器的个数。

代码:

#include<stdio.h>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 100
#define M 20
#define oo 1234567
using namespace std;
int n,m,q[N*N];
double dis[N][M],a[N][N][M];
bool b[N]={0};
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<‘0‘||ch>‘9‘)
    {
        if(ch==‘-‘) f=-1;
        ch=getchar();
    }
    while(ch>=‘0‘&&ch<=‘9‘)
    {
        x=x*10+ch-‘0‘;
        ch=getchar();
    }
    return x*f;
}
void spfa()
{
    int head(0),tail(1),u;
    q[1]=1;
    b[1]=1;
    do
      {
           head++;
           u=q[head];
           b[u]=0;
           for (int i=1;i<=n;i++)
             if (i!=u)
               for (int j=0;j<=m;j++)//从1到u使用j个加速器
                 for (int k=0;k<=m-j;k++)//从u到i使用k个加速器,同时要保证j+k<=m
                   if (dis[u][j]+a[u][i][k]<dis[i][j+k])
                     {
                          dis[i][j+k]=dis[u][j]+a[u][i][k];
                          if (!b[i]) q[++tail]=i,b[i]=1;
                   }
      }while (head<tail);
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
     for(int j=1;j<=n;j++)
      {
          scanf("%lf",&a[i][j][0]);
          if(!a[i][j][0])
           for(int k=0;k<=m;k++)
          a[i][j][k]=oo;
        else
         for(int k=1;k<=m;k++)
          a[i][j][k]=a[i][j][k-1]/2;
      }
    for(int i=2;i<=n;i++)
     for(int j=0;j<=m;j++)
       dis[i][j]=oo;
    spfa();
    printf("%.2lf",dis[n][m]);
    return 0;
}
时间: 2024-08-07 08:06:44

网络提速(最短路)的相关文章

16.网络提速(最短路)

网络提速(最短路) 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 某学校的校园网由n(1<=n<=50)台计算机组成,计算机之间由网线相连,如图5.其中顶点代表计算机,边代表网线.正如你所见,不同网线的传输能力不尽相同,例如计算机1与计算机2之间传输信息需要34秒,而计算机2与计算机3之间的传输信息只要10秒.计算机1与计算机5之间传输信息需要44秒,途径为机1到机3到机5. 现学校购买了m(1<=

[codevs 1243][网络提速(最短路分层思想)

题目:http://dev.codevs.cn/problem/1243/ 分析: 先容易想到将一个点拆成m个点,分别对应不同的边连过去,但是想不到控制加速器数量的办法.看了题解才知道,每个点的分层,如0,1,2,……,m是表示从起点走到目前为止用的加速器的数量,这样就可以了,真的很巧妙……

BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )

最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> #include<iostre

【BZOJ-3931】网络吞吐量 最短路 + 最大流

3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1228  Solved: 524[Submit][Status][Discuss] Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择最优的路径转发数据包.例如在常用的路由算法OSPF(开放式最短路径优先)中

【BZOJ3931】【CQOI2015】网络吞吐量 最短路+网络流

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44922137"); } 题解: --两遍最短路然后判断哪些边可以在某条最短路上,然后加到网络流图中. 然后题意是一个点经过流量有限制,拆点就好. 然后有重边Qwq(调了好久...) 然后或许有自环,不过这并不影响什么. 代码: 调试

codevs 1243 网络提速

题目描述 Description 某学校的校园网由n(1<=n<=50)台计算机组成,计算机之间由网线相连,如图5.其中顶点代表计算机,边代表网线.正如你所见,不同网线的传输能力不尽相同,例如计算机1与计算机2之间传输信息需要34秒,而计算机2与计算机3之间的传输信息只要10秒.计算机1与计算机5之间传输信息需要44秒,途径为机1到机3到机5. 现学校购买了m(1<=m<=10)台加速设备,每台设备可作用于一条网线,使网线上传输信息用时减半.多台设备可用于同一条网线,其效果叠加,即

BZOJ 3931 CQOI 2015 网络吞吐量 最短路+最大流

题目大意 给出一个无向图,求出在这个图上1到n的所有最短路形成的图的最大流. 思路 想让大家叠模板也不带这么懒得吧.. 记得开long long就行了. CODE #define _CRT_SECURE_NO_WARNINGS #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAXP 100

[codevs1243]网络提速

题目大意:有n台电脑,m个加速器,每台电脑之间传输文件有一个时间,每个加速器可以使传输时间减半(两台电脑之间可以有多个加速器),求电脑1传输文件到电脑n的最短时间. 解题思路:有些人先求出最短路径,再每次找当前最短路径的最长边用加速器(即贪心),然而这种方法有反例.例如: 3 1 0 3 7 3 0 3 7 3 0 贪心的话求出来的是4.5(1-2-3,在1-2或2-3之间用加速器),然而最优解是3.5(1-3,在1-3之间用加速器). 正确的解法应该是:最短路径+DP……吧(反正就是有点像最短

飞塔防火墙配置2条网络链路分流

飞塔配置2条网络链路分流 背景描述: 办公室网络原专线带宽不够,需要新增一条ppoe光纤拨号,实现网络提速,改善网络体验. 链路分配: PPOE光纤:非公司内网业务流量出口,即访问百度这些网站流量出口 专线:访问公司内部系统定向流量出口,即访问公司业务后台 操作步骤: 1.配置wan1为PPOE光纤拨号接口 2.更改原策略 将目的端口由原来的wan2改为wan1 3.更改静态路由 (1)更改总出口路由,由原来的wan2口更改为wan1口 (2)由于要完成wan2到公司内网通过VPN隧道的访问,所