借鉴了陈峰在训练指南的思路, 表示感谢
提示: 1. 直接求最短路是有困难的, 因为状态不满足独立性 , 所以拆点
2. 将(x , y)细分成 , (x , y , dir , doubled) , 后两个分别为到这个点时的方向、这条边是否两次计算了
3. 将每一个状态用一个id 函数投射到一个具体的数值 , 然后预处理所有状态之间的边(处理好那些double) , 这样求最短路就是一个独立的过程
4. 开头的源点不好把握 , 所以特殊处理 , 将第一次转移拿出来 ; 但结尾的统计是简单的
注意: 为了方便各种mod , 和计算id , 使用从0开始的坐标会更简单 , 如果有人看过训练指南的代码仓库这个题的代码 , 就会发现写的很麻烦 , 这种题目一定要注意 , 充分利用状态 , 不要给自己添麻烦 , 详情见代码
//
// main.cpp
// UVa 1078
//
// Created by Fuxey on 15/10/7.
// Copyright © 2015年 corn.crimsonresearch. All rights reserved.
//
#include
#include
#include
#include
#include
#include
#include
#include
#include
Ps: 这是最裸的 , 不使用邻接表 , 不手写队列的版本 , 估计都实现可以速度快上两倍 , 有兴趣的可以自己实现
文章有任何纰漏 , 或者有任何问题 , 请告知博主: QQ:812483101