一開始是想跑bfs()去做,但是後來發現,可以避免這樣的重複進入佇列中,於是,就想著優化bfs,就變成了spfa,優化的量級還是可觀的,至少在我校oj上變成了rank1。
(才不給你們看我的user名稱呢……略略略)
其實也可以看作網路流:
就是單位流來做,但是沒必要,建單位流的邊去跑最段路,豈不是直接spfa會更好些呢。
#include #include #include #include #include #include #include #include #include #include #include #include #define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define inf 0x3f3f3f3f
#define half (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define lson lsn, l, mid
#define rson rsn, mid+1, r
#define ql lson, ql, qr
#define qr rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxn = 105;
const int dir[4][2] =
;int n, k, a, b, c, mp[maxn][maxn];
int vis[maxn][maxn][11];
struct node
};queueq;
bool inque[maxn][maxn][11];
bool in_map(int x, int y)
inline int bfs()
if(mp[x][y])
if(!step)
}continue;
}if(vis[x][y][step] > cost)}}
}return ans;
}int main()
網路流24題 汽車加油行駛問題
我們設 dp i k 表示節點為i,現在還有k條邊可以走的狀態。然後跑乙個最短路就行了。因為是不定項更新,所以考慮spfa。注意到了加油站是強制消費。然後分向上下左右四個方向走和原地建加油站五種情況來討論。注意最後更新答案的時候k 0不要忘了考慮!要不然就會像我一樣wa掉乙個點 如下 include...
網路流24題 汽車加油行駛問題
題面 傳送門思路 汽車油箱最多只能裝10格油,因此可以依據油量建立分層圖 共11層 然後spfa跑最短路 不用把每一條邊都建出來,用的時候判斷就好了 沒了真是披著網路流外衣的最短路啊 code 1 include2 include3 include4 include5 define inf 1000...
網路流24題 汽車加油行駛問題 題解
題目傳送門 題目大意 有一張網格圖,起點為 1,1 1,1 1,1 終點為 n,n n,n n,n 汽車滿油時可以走 k kk 步,每步只能沿著網格邊走,如果走到加油站則必須加滿油,費用為 a aa,你也可以在任意地方新建乙個加油站,費用為 c cc,走的過程中,如果 x xx 或 y yy 座標減...