本周博客总结

本周博客总结

 

浅学了一下一个int的快读:

因为总是超时所以不得不学

inline int read(){

   int s=0,w=1;

   char ch=getchar();

   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}

   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();

   return s*w;

}

 

Dijkstra的思想和Floyd的部分思想是一样的,有用到了一个神奇的东西:松弛操作

if(map[i][j]>map[i][k]+map[k][j])

    map[i][j]=map[i][k]+map[k][j];

这就是Dijkstra与Floyd的核心思想,Dijkstra就是把时间复杂度降低,范围缩小而已。

 

题目:

1342请柬

核心思想:两遍最短路.

邮局去各地的时间直接套最短路模板,各地到邮局时间用逆向思维,视为求邮局沿反边到各地的时间即可.

提高效率的方法:

用Dijkstra+堆优化算法,这种算法虽可能比SPFA慢一点点,但复杂度稳定可算;而SPFA复杂度不稳定,有很多题目都有专卡SPFA的数据

用结构体代替数组,写着方便

手写邻接表+加边

在局部函数前加inline

在局部变量前加register

使用读入优化

 

1364医院设置

floyd算法题

问题中的结点数并不多,数据规模也不大,采用邻接矩阵存储,用Floyed法求出任意两结点之间的最短路径长,然后穷举医院可能建立的n个结点位置,找出一个最小距离的位置即可。

 

1576最小花费

如果A到B的汇率是 x ,B到C的汇率是y那么A到C的汇率就是x*y,所以原来SPFA模板中更新权值就可以改成乘的形式

因为最后要求出最少的汇款,所以就要求A与B之间的汇率最大,那么现在就很显然了

 

1744采购特价商品

在直角坐标下计算两点距离:

double dis(int x1,int y1,int x2,int y2){

    return sqrt(pow(x1-x2,2)+pow(y1-y2,2));

}

spfa:

定义一个队列,将第一号点放进把队列的每一个数拿出来看并标记已出队还有pop掉。挨个看所有与这个点联通的点如果更优,判断是否再队列里,如果不在,放到队列里并更新最短路。如果不更优,啥都不干。

 

1821 cowpartys

单向建图:

题目要求是求 一个单源最短路 + 一个单终点最短路 的最大值;

但是题解交给我一个方法:

反向建图,把单终点最短路转为单源最短路,只需要跑两次最短路算法。

使用dijkstra

 

2935 best spot s

题目要求哪个点与

F个点的距离(即题面中的时间)和最小,就得求出每个点分别到这F的点的最小距离,可用 且 只能用Floyd

步骤:

跑一遍Floyd,枚举每个点,算出距离总和,同时找距离和最小的一个点记录下标,输出这个下标即可

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值