P4009 汽车加油行驶问题 题目描述 给定一个\(N×N\)的方形网格,设其左上角为起点◎,坐标(1,1) ,\(X\)轴向右为正,\(Y\)轴向下为正,每个方格边长为1 ,如图所示. 一辆汽车从起点◎出发驶向右下角终点▲,其坐标为\((N,N)\) . 在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油.汽车在行驶过程中应遵守如下规则: 汽车只能沿网格边行驶,装满油后能行驶\(K\)条网格边.出发时汽车已装满油,在起点与终点处不设油库. 汽车经过一条网格边时,若其\(X\)坐标或\(Y…
分层图,建k层,设(i,j,0)为点(i,j)的满油状态,全图的流量都是1,因为重复走到一个点没有意义.如果当前点是加油站,那么它向它上左的点连费用为a的边,向下右连费用为a+b的边: 否则,这个点的所有层向零层连费用为a+c的边表示建加油站和加油,其他的当前点是加油站的情况连即可,但是不用加a.然后s向(1,1,0)连,(n,n)的所有层向t连,最后跑最小费用最大流. #include<iostream> #include<cstdio> #include<cmath>…
题目描述 给定一个 N \times NN×N 的方形网格,设其左上角为起点◎,坐标(1,1)(1,1),XX 轴向右为正, YY 轴向下为正,每个方格边长为 11 ,如图所示. 一辆汽车从起点◎出发驶向右下角终点▲,其坐标为 (N,N)(N,N). 在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油.汽车在行驶过程中应遵守如下规则: 汽车只能沿网格边行驶,装满油后能行驶 KK 条网格边.出发时汽车已装满油,在起点与终点处不设油库. 汽车经过一条网格边时,若其 XX 坐标或 YY 坐标减小…
题目:https://www.luogu.org/problemnew/show/P4009 网络流24题中不是网络流的最短路题: 把每个点拆成各个油量上的点,根据要求连边即可: 注意:点数最大为100*100*11,因为虽然k<=10,但还有k=0的状态!(竟然因为边界调了一晚上) 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<queue> using nam…
传送门 说好的网络流24题呢……上次是状压dp,这次怎么又最短路了…… 不过倒是用这题好好学了一下分层图最短路 把每一个位置$(x,y)$,油量剩余$k$表示为一个状态,然后转化成一个$n$进制数,这样每一个状态都可以唯一表示.能互相转移的状态之间连有向边,然后跑一个最短路就行了 具体细节看代码好了……细节太多说不清楚…… ps:据说还可以用这个思想跑费用流,我估摸着大概是建源$S$和汇$T$,$S$向起点连,终点向$T$连,容量$inf$,费用$0$,然后各个状态之间的容量都是$1$,费用就是…
求出平均数sum,对于大于sum的点连接(s,i,a[i]-sum,0),表示这个点可以流出多余的部分,对于小于sum的点连接(i,t,sum-a[i],0)表示这个点可以接受少的部分,然后每个点向相邻的两个点连(i,j,inf,1)表示可以任意转移,每转移一份产生1费用,注意这是个环所以首尾相连.然后跑最小费用最大流即可. #include<iostream> #include<cstdio> #include<queue> #include<cstring&g…
题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含四个正整数ui.vi.wi.fi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi),单位流量的费用为fi. 输出 一行,包含两个整数,依次为最大流量和在最大流量情况下的最小费用. 样例输入 4 5 4 34 2 30 24 3 2…
发了网络流,再来一发费用流 能做费用流的,网络流自然做得来,但在这还是不要脸的安利一下自己的博客(里面也有网络流的题解): 点我 扯远了... 费用流,就是在不炸水管的情况下求源点到汇点的最小费用. 有没有想起什么? 思考一下...... 对,最短路径! 所以我们完全可以用已死的SPFA求出不炸水管的最短路径(当然,实在有心理阴影的可以用dijkstra). 如果你最短路径都不会,还是去 这儿 和 这儿 然后再一把增广路求出最大流与最小费用就好了(我觉得很OK) 献上本蒟蒻的代码: #inclu…
建图细节比较多,对于每个点i,拆成i和i',i表示用的餐巾,i'表示脏餐巾,连接: (s,i,r[i],p)表示在这一天买新餐巾 (i,t,r[i],0)表示这一天用了r[i]的餐巾 (s,i+n,r[i],0)表示这一天有r[i]条脏餐巾 if(i+ft<=n) ins(i+n,i+ft,inf,fp)注意特判,表示送去快洗,inf是因为这一天的脏餐巾不止这一天剩下的,还有之前剩下的 if(i+st<=n) ins(i+n,i+st,inf,sp)注意特判,表示送去慢洗,inf是因为这一天的…
P4009 汽车加油行驶问题 最短路 清一色的spfa....送上一个堆优化Dijkstra吧(貌似代码还挺短) 顺便说一句,堆优化Dj跑分层图灰常好写 #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; template <typename T> inline T min(T &a,T &b) {re…