P2488 [SDOI2011]工作安排

题目

题目

思路

观察到题目中的一个美好性质: W i , j W_{i,j} Wi,j随j递增。
我们是spfa贪心求解,所以我们可以这样建边:
s到每个工作连容量 C i C_i Ci,费用0的边。
每个工作和人按给的可达矩阵建容量1e8(inf),费用0的边。
每个人向t连容量为分段长度,费用为分段愤怒的边。
W i , j W_{i,j} Wi,j随j递增可以保证我们在 W i , j W_{i,j} Wi,j被流过时, W i , j − 1 W_{i,j-1} Wi,j1一定被流满了。
接下来Dinic+spfa。
code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#include<deque>
using namespace std;
//When I wrote this code,God and I unterstood what was I doing 
int n,s,t,x,y,tot=2,head[5001],dep[5001],fy;
bool book[5001];
long long w,ans,in[5001],ans2;
long long mn(long long x,long long y)
{
	return (x>y?y:x);
}
struct f{
	int to,net;
	long long w,fy;
} a[1000011];
int b[1000011];
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 wj[5001],m;
int main()
{
	scanf("%d%d",&m,&n);
	s=n+m+1,t=s+1;
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&w);
		add(s,i,w,0);
		add(i,s,0,0);
	}
	for (int i=1;i<=m;i++) for (int j=1;j<=n;j++)
	{
		scanf("%d",&x);
		if (x)
		{
			add(j,i+n,1e8,0);
			add(i+n,j,0,0);
		}
	}
	for (int i=1;i<=m;i++)
	{
		scanf("%d",&x);
		for (int j=1;j<=x;j++)
		{
			scanf("%d",&wj[j]);
		}
		wj[x+1]=1e8;
		for (int j=1;j<=x+1;j++)
		{
			scanf("%d",&y);
			add(i+n,t,wj[j]-wj[j-1],y);
			add(t,i+n,0,-y);
		}
	}
	while (spfa())
	{
		dfs();
	}
	cout<<ans2;
    return 0;
}
//Now,only God know
//但行好事,莫问前程 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JavaScript 编写的记忆游戏(附源代码)   项目:JavaScript 记忆游戏(附源代码) 记忆检查游戏是一个使用 HTML5、CSS 和 JavaScript 开发的简单项目。这个游戏是关于测试你的短期 记忆技能。玩这个游戏 时,一系列图像会出现在一个盒子形状的区域中 。玩家必须找到两个相同的图像并单击它们以使它们消失。 如何运行游戏? 记忆游戏项目仅包含 HTML、CSS 和 JavaScript。谈到此游戏的功能,用户必须单击两个相同的图像才能使它们消失。 点击卡片或按下键盘键,通过 2 乘 2 旋转来重建鸟儿对,并发现隐藏在下面的图像! 如果翻开的牌面相同(一对),您就赢了,并且该对牌将从游戏中消失! 否则,卡片会自动翻面朝下,您需要重新尝试! 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox, 以获得更好、更优化的游戏体验。要玩游戏,首先,通过单击 memorygame-index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值