[网络流24题]汽车加油行驶问题(分层图)
题意 链接 思路 假的网络流 由于无法直接储存油量这个状态,加上k很小,可以把原图分层,分为k+1层图,分别表示当前油量为0~k 连边 对于满油的第k层,连给四个方向,如果向回走了权值为B,否则为0,表示走一步 对于非满油层,如果当前点是加油站,那么它只有一条指向第k层对应点的边,权值为A,表示加一次油 对于非满油层,如果当前节点不是加油站,那么它可以连给下一层对应的四个方向,同1;它也有一条连向第k层对应点的边,权值为A+C,表示建立加油站并且加一次油(由于网格图上的每一个点最多走一次,所以这样连边的正确性可以保证) 最后将终点所对应的k+1个点连给汇点t,边权为0 从第k层的s点出发跑最短路,dis[t],即为答案 Code: #include<bits/stdc++.h> #define N 200005 #define M 2000005 using namespace std; int n,k,A,B,C,s,t; int a[105][105]; int dis[N]; bool vis[N]; struct Node { int u,dis; bool operator < (const Node a)const { return a.dis<dis; } }; struct Edge { int next,to,dis; }edge[M];int head[N]