[bzoj3389][Usaco2004Dec]Cleaning Shifts安排值班_最短路

Cleaning Shifts bzoj-3389 Usaco-2004Dec

题目大意:每天有n个时间段,每个时间段都必须安排一个奶牛值班。有m个奶牛,每个奶牛只有一个空闲时间s[i]~e[i],求至少动用多少奶牛。

注释:$1\le n\le 10^6$,$1\le m\le 25,000$。

想法:神题

我们将所有的时间点排成一排,然后对每一个i+1向i连一条无代价的边。

对于每一个s[i]向其对应的e[i]连边,代价为1.

然后求1到n的最短路即可

这样建图的道理:首先,从后面的时间点向前面的时间点连边是没有任何问题的。这就相当于我已经管理到了x时间段,我雇佣一个开始于x之前的奶牛,显然是可行且无代价的。

那么从s[i]向e[i]连边,就是说我雇佣这头奶牛,此时我已经管理到了e[i]这个时间点。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define M 1000010 
#define N 30010 
using namespace std;
int dis[M];
bool v[M];
struct cmp
{
	bool operator()(int x,int y)
	{
		return dis[x]>dis[y];
	}
};
priority_queue<int,vector<int>,cmp>q;
int head[M],to[N+M],nxt[N+M],val[N+M],tot;
inline void add(int x,int y,int z)
{
	to[++tot]=y;
	val[tot]=z;
	nxt[tot]=head[x];
	head[x]=tot;
}
inline void original()
{
	memset(dis,0x3f,sizeof dis);
}
int main()
{
	int n,m;
	cin >> n >> m ;
	for(int i=1;i<=m;i++) add(i,i-1,0);
	original();
	for(int x,y,i=1;i<=n;i++)
	{
		scanf("%d%d",&x,&y);
		add(x-1,y,1);
	}
	dis[0]=0;
	q.push(0);
	while(!q.empty())
	{
		int x=q.top();q.pop();
		if(v[x]) continue;
		for(int i=head[x];i;i=nxt[i])
		{
			if(v[to[i]]) continue;
			if(dis[to[i]]>dis[x]+val[i])
			{
				dis[to[i]]=dis[x]+val[i];
				q.push(to[i]);
			}
		}
	}
	if(dis[m]==0x3f3f3f3f) printf("-1\n");
	else printf("%d\n",dis[m]);
	return 0;
}

小结:好题,感觉自己图论菜的一匹... ...

转载于:https://www.cnblogs.com/ShuraK/p/9301764.html

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值