由于随着时间的变化,网络中的边会变,所以普通的网络流无法解决这样的问题。假设T时刻全部运完。
为此,我们可以基于时间拆点,将所有点拆成T个点,
每个点对于下一个时刻的自己都连一条容量为INF边,费用为1的边,意思就是在当前空间站等待1个时刻。
每个点对于下一个时刻能到的点,连一条边,容量是这艘太空船的容量,费用是1。
源点连0时刻的地球,容量为k,所有的月球连接汇点。费用都为0。
每次找到一条最短路进行增广,若增广流量达到总人数,则退出。
这时候找到最后到达月球的时刻。
建图的样子。
![\]()
#include
#include
#include
#include
using namespace std; #define MAXN 10000 #define MAXM 1000000 #define INF 0x3f3f3f3f struct node { int u,v,f,c,next; }e[MAXM]; int n,head[MAXN],pre[MAXN],dist[MAXN],vis[MAXN],ans; int en,s,t,maxflow,mincost; //s源点,t汇点 void add(int u,int v,int c,int f)//加边 { e[en].u=u; e[en].v=v; e[en].c=c; e[en].f=f; e[en].next=head[u]; head[u]=en++; e[en].u=v; e[en].v=u; e[en].c=-c; e[en].f=0; e[en].next=head[v]; head[v]=en++; } int spfa() { int i,u,v; for(i=0;i<=t;i++) pre[i]=-1,vis[i]=0,dist[i]=INF; dist[s]=0; vis[s]=1; queue
q; q.push(s); while(!q.empty()) { u=q.front(); q.pop(); for(i=head[u];i!=-1;i=e[i].next) { v=e[i].v; if(e[i].f>0&&dist[u]+e[i].c