POJ3159 Candies(差分约束)

每日打卡(1/1)

传送门:点击打开链接

题目大意:

    n个人,m钟比较,每行的信息是3个数字,A,B,C,表示B比A多出来的糖果不超过C个,问你,n号人最多比1号人多几个糖果

题目思路:

    可以观察以下三角不等式:

    B-A>x

    C-B>y

    C-A>z

    那么,C-A的最大值就是min(z,x+y),刚开始我认为最大值应该是x+y,仔细思考后发现,由于第三个条件,所以最大值一定是两者之间的较小值。这种问题,我们称为差分约束问题。

    对于这种问题的求解,我们可以采用最短路的思想,因为其松弛过程和比较过程是相对应的。所以用dijkstra求起点到终点的最短路,即可解决该问题。

    由于本题数据卡的很厉害,所以以往的优先队列版dijkstra模板需要修改。

    (1)需要用链式前向星代替vector。链式前向星我会再写一篇博客。

    (2)需要添加vis数组,否则会TLE。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<vector>
using namespace std;
const int maxn = 300005;

struct node{
	int next,y,cost;
}E[maxn];
int t,n,d[maxn],m,head[maxn];
bool vis[maxn];

void init()
{
	memset(head,-1,sizeof(head));
	memset(d,0x3f3f3f,sizeof(d));
}

int main()
{
//	freopen("d://test.txt","r",stdin);
	scanf("%d%d", &n,&m);
	init();
	int tot = 0;
	while(m--)
	{
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		E[tot].next = head[x];
		E[tot].y = y;
		E[tot].cost = z;
		head[x] = tot++;
	}
	int s,e;
	s = 1,e = n;
	d[s] = 0;
	priority_queue<pair<int,int> >q;
	q.push(make_pair(-d[s],s));
	while(!q.empty())
	{
		int now = q.top().second;
		q.pop();
		if(vis[now]) continue;
		vis[now] = 1;
		for(int i=head[now];i!=-1;i=E[i].next)
		{
			int v = E[i].y;
			if(d[v]>d[now]+E[i].cost)
			{
				d[v] = d[now]+E[i].cost;
				q.push(make_pair(-d[v],v));
			}
		}
	}
	cout<<d[e]<<endl;
	return 0;
}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、下4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、下4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

总想玩世不恭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值