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<=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

数据范围及提示 Data Size & Hint

分类标签 Tags 点此展开

思路:先找出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{

int from,to;

double weigh;//因为最后结果保存2位小数,所以权值也要是浮点数才行

};

Edge edge[maxn*maxn];//存最短路径的边

void input();

void dijkstra();

int cmp(const Edge &a,const Edge &b)

{

return a.weigh>b.weigh;

}

void stim()

{

while(pre[n]!=0)//把最短路径放到结构体中

{

edge[++t].from=pre[n];

edge[t].to=n;

edge[t].weigh=p[pre[n]][n];

n=pre[n];

}

sort(edge+1,edge+t+1,cmp);//巴结构体的边权有大到小排序

int edgel;

while(m)

{

edgel=1;//比较指针

while(m)

{

while(edge[edgel].weigh>edge[edgel+1].weigh)//把大数一次性除得比第二个数小

{

m--;

edge[edgel].weigh/=2;

if(m==0)return;

}

edgel++;//比较2与3

if(edgel==t) //比到最后一个时,再重新排序,由大到小,分别/2

break;

}

sort(edge+1,edge+t+1,cmp);

}

}

int main()

{

input();

dijkstra();

stim();

for(int i=1;i<=t;++i)

sum+=edge[i].weigh;

printf("%.2lf",sum);

return 0;

}

void dijkstra()

{

visit[1]=1;

pre[1]=0;//把1的前驱设为0

dist[1]=0;//注意

for(int i=2;i<=n;++i)

if(dist[i]<99999)

pre[i]=1;       //把前驱是1的先设上,因为下面算法,不会给他设

for(int i=1;i<=n;++i)

{

int min=99999,k=0;

for(int j=1;j<=n;++j)

{

if(dist[j]

{

k=j;

min=dist[j];

}

}

if(k==0) break;

visit[k]=1;

for(int j=1;j<=n;++j)

{

if(dist[j]>dist[k]+p[k][j])

{

dist[j]=dist[k]+p[k][j];

pre[j]=k;//记录前驱

}

}

}

}

void input()

{

scanf("%d%d",&n,&m);

for(int i=1;i<=n;++i)

for(int j=1;j<=n;++j)

{

scanf("%d",&p[i][j]);

if(p[i][j]==0)

p[i][j]=99999;

if(i==1)

dist[j]=p[i][j];

}

}

时间: 2024-10-13 02:37:59

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

网络提速(最短路)

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<

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

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

#15、#16 网络的基本构成与网络的几协议

什么是网络? 网络: 网络基础知识 网络的概念 网络的功能,特性,组成,结构: 两个网络模型(iOS/OSI,TCP/IP) 网络组件知识: 交换机基础 路由器基础 网络设备的进阶: 网络架构 数据通信 资源共享 网络部分组成:操作系统.数据库.应用协议.应用程序 硬件部分组成:计算机.网络通信设备.交联互联设备 网络模型分层 用户层 7应用层                     降低复杂性 6表示层                     标准版化解 5会话层              

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: [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(开放式最短路径优先)中

16 网络编程 - 《Python 核心编程》

?? 引言:客户/服务器架构 ?? 套接字:通信终点 ?? 面向连接与无连接套接字 ?? Python 中的网络编程 ?? Socket 模块 ?? 套接字对象方法 ?? TCP/IP 客户端和服务器 ?? UDP/IP 客户端和服务器 ?? SocketServer 模块 ?? Twisted 框架介绍 ?? 相关模块 16.1 介绍 什么是客户/服务器架构? 服务器是一个软件或硬件,用于提供客户需要的“服 务”. 服务器存在的唯一目的就是等待客户的请求,给这些客户服务,然后再等待其它的请求.

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

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

chapter 16 网络编程

套接字:通讯端点什么是套接字? 书上说的端口是数据结构和I/O缓存区"是指硬件端口,网络编程里的端口可以理解为应用程序的ID. 说得形象点,套接字就类似我们人类的门我们打开门,通过门外面的人可以进来我们推开门,里面的人也可以出去同样,外面的数据可以通过socket把它存储在本地机器的缓冲区里等待本地机器接收本地机器的数据可以通过socket放在缓冲区里等待发送到对方机器上当我们把门给关上时,就拒绝了和外面世界的交往. 套接字是一种具有之前所说的"通讯端点"概念的计算机网络数据