bzoj 1061 志愿者招募

明显的线性规划网络流,据说当时考场上就1个人A了?

a[i][j]表示第i种志愿者第j天是否工作
p[i]表示第i种志愿者的人数
sigma(a[i][x]*p[i])>=need[x]
补充函数y[i],则sigma(a[i][x]*p[i])=need[x]+y[x]
差分,start[i]表示第i种志愿者开始工作的时间,end[i]表示第i种志愿者结束工作的时间
sigma(p[i]*(start[i]==1))=need[1]+y[1] 1
-sigma(p[i]*(start[i]==x))+sigma(p[i]*(end[i]==x-1))=need[x]-need[x-1]+p[x]-p[x-1] x
sigma(p[i]*(end[i]==day))=-need[n]-y[n] n+1

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>

#define md
#define ll long long
#define inf (int) 1e9
#define eps 1e-8
#define N 200010
#define M 200010
using namespace std;
struct yts{int x,t,ne,f,c;} e[2*M];
int dis[N],vis[N],path[N],flow[N],q[N],v[N];
int p[N];
int num=1,S,T,ans=0;
void put(int x,int y,int f,int c)
{
 num++; e[num].x=x; e[num].t=y; e[num].f=f; e[num].c=c;
 e[num].ne=v[x]; v[x]=num;
}
void add(int x,int y,int f,int c)
{
 put(x,y,f,c); put(y,x,0,-c);
}
bool spfa()
{
 int h=0,w=1,x,y;
 for (int i=1;i<=T;i++) dis[i]=inf;
 memset(vis,0,sizeof(vis)); dis[S]=0; path[S]=0; flow[S]=inf;
 q[1]=S; vis[S]=1;
 while (h!=w)
 {
  h++; if (h>T+2) h=1; x=q[h];
  for (int i=v[x];i;i=e[i].ne)
  {
   y=e[i].t; int f=e[i].f,c=e[i].c;
   if (f&& dis[x]+c<dis[y])
   {
    dis[y]=dis[x]+c; path[y]=i; flow[y]=min(flow[x],f);
    if (!vis[y])
    {
     w++; if (w>T+2) w=1; q[w]=y;
     vis[y]=1;
    }
   }
  }
  vis[x]=0;
 }
 if (dis[T]==inf) return 0;
 int f=flow[T]; ans+=dis[T]*f;
 path[S]=0;
 for (int x=T,i=path[x];x!=S;x=e[i].x,i=path[x])
 {
  e[i].f-=f; e[i^1].f+=f;
 }
 return 1;
}
void outit()
{
 for (int i=2;i<=num;i++) printf("%d %d %d %d\n",e[i].x,e[i].t,e[i].f,e[i].c);
}
int main()
{
 int n,m;
 scanf("%d%d",&n,&m);
 p[0]=p[n+1]=0; S=n+3,T=n+4;
 for (int i=1;i<=n;i++)
 {
  scanf("%d",&p[i]);
  if (p[i]-p[i-1]>0) add(S,i+1,p[i]-p[i-1],0);
  else if (p[i-1]-p[i]>0) add(i+1,T,p[i-1]-p[i],0);
 }
 add(n+2,T,p[n],0);
 for (int i=1;i<=m;i++)
 {
  int x,y,z;
  scanf("%d%d%d",&x,&y,&z);
  add(x+1,y+2,inf,z);
 }
 //outit();
 for (int i=0;i<=n;i++) add(i+2,i+1,inf,0);
 while (spfa());
 printf("%d\n",ans);
 return 0;
}
 


你可能感兴趣的:(bzoj 1061 志愿者招募)