本周博客总结
浅学了一下一个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,枚举每个点,算出距离总和,同时找距离和最小的一个点记录下标,输出这个下标即可