P3980 [NOI2008] 志愿者招募

题目

题目

思路

为啥志愿者要钱啊
看到题目盲猜是要按天数来跑。
可以发现,如果没有志愿者,网络流后所有天数之间边的容量会被填至 m x − a i mx-a_i mxai(mx为 a i a_i ai的最大值),我们人工加入一个mx为inf,显然这时我们还需要边把t补到inf。
那么我们可以这样建边:
s到Day1有容量inf,费用0的边。
Dayn+1到t有容量inf,费用0的边(n+1即人工加入的mx)
每一天到后一天,有容量inf- a i a_i ai,费用0的边。
那么志愿者怎么办?
首先边肯定要带权(废话),其次按前面的说法要补到inf,所以容量为inf,那么从谁连到谁呢?
从x到y+1。显然不能一天一天连下去(即使不TLE也没法跑费用流,理由显然),从x到y+1相当于我们把从x到y的所有点都加上了其流量(一点流量相当于一个人),契合题意。
code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int n,m,s,t,x,y,tot=2,head[5001],dep[5001],ans2,fy;
bool book[5001];
long long w,ans,in[5001];
long long mn(long long x,long long y)
{
    
    
	return (x>y?y:x);
}
struct f{
    
    
	int to,net;
	long long w,fy;
} a[100011];
int b[100011];
void add(int x,int y,long long w,long long fy)
{
    
    
	a[tot].to=y,a[tot].w=w,a[tot].net=head[x],a[tot].fy=fy,head[x]=tot++;
	return;
}
bool spfa()
{
    
    
	memset(dep,0x3f,sizeof(dep));
	memset(book,0,sizeof(book));
	queue<int> u;
	u.push(s);
	book[s]=1,dep[s]=0,in[s]=0x7fffffff;
	while (u.size())
	{
    
    
		y=u.front();
		u.pop();
		book[y]=0;
		for (int j=head[y];j;j=a[j].net)
		{
    
    
			if (a[j].w!=0&&dep[y]+a[j].fy<dep[a[j].to])
			{
    
    
				dep[a[j].to]=dep[y]+a[j].fy;//记录单价和 
				in[a[j].to]=min(in[y],a[j].w);
				b[a[j].to]=j;
				if (!book[a[j].to]) book[a[j].to]=1,u.push(a[j].to);
			}
		}
	}
	return dep[t]!=1061109567;
}
void dfs()
{
    
    
	x=t;
	ans+=in[t];
	ans2+=dep[t]*in[t];
	while (x!=s)
	{
    
    
		a[b[x]].w-=in[t],a[b[x]^1].w+=in[t],x=a[b[x]^1].to; 
	}//清空增广路 
	return;
}
int main()
{
    
    
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)
	{
    
    
		scanf("%lld",&w);
		add(i,i+1,1e7-w,0);
		add(i+1,i,0,0);
	}
	s=0,t=n+2;
	add(s,1,1e7,0);
	add(1,s,0,0);
	add(n+1,t,1e7,0);
	add(t,n+1,0,0);
	for (int i=0;i<m;i++)
	{
    
    
		scanf("%lld%lld%lld",&x,&y,&fy);
		y++;
		add(x,y,1e7,fy);
		add(y,x,0,-fy);
	}
	while (spfa())
	{
    
    
		dfs();
	}
	cout<<ans2;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_49843717/article/details/115142424