【LuoguP1629】邮递员送信

本文探讨了一个邮递员如何在繁忙的城市交通中,寻找最优路径以最短时间完成送信任务并返回邮局的问题。通过两次运行SPFA算法,分别计算从邮局到各节点及反方向的最短路径,进而找到总时间最小的方案。

邮 递 员 送 信 邮递员送信

L u o g u   P 1629 Luogu\ P1629 Luogu P1629

题目描述

有一个邮递员要送东西,邮局在节点 11。他总共要送 n-1n−1 样东西,其目的地分别是节点 22 到节点 nn。由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有 mm 条道路。这个邮递员每次只能带一样东西,并且运送每件物品过后必须返回邮局。求送完这 n-1n−1 样东西并且最终回到邮局最少需要的时间。

输入格式

第一行包括两个整数,nm,表示城市的节点数量和道路数量。

第二行到第 (m+1)(m+1) 行,每行三个整数,u , v , w,表示从 uv 有一条通过时间为 w 的道路。

输出格式

输出仅一行,包含一个整数,为最少需要的时间。

输入输出样例

输入样例

5 10
2 3 5
1 5 5
3 5 6
1 2 8
1 3 8
5 3 4
4 1 8
4 5 3
3 5 6
5 4 2

输出样例

83

说明/提示

对于 30% 的数据,1≤n≤200

对于 100% 的数据,1≤n≤10^3 ,1≤m≤10^5,输入保证任意两点都能互相到达。

解题思路

  • 由题可知,可以理解为你需要从起点到所有点,然后再从所有点到起点
  • 所以就可以让这两次的和最小,就可以正常跑一次SPFA,然后再把所有边反过来再跑一边SPFA即可

代码如下

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,p,u,v,w,ans,t[1001],tt[1001],k,d[1001],dd[1001];

struct node
{
	int to,next,x;//to表示这个儿子是谁   next表示下一个儿子的位置  x表示父亲到当前儿子的边的距离(值) 
}e1[100001],e2[100001];
queue<int>q;
bool in[1001];
int main()
{
	memset(d, 0x7f, sizeof(d));
	memset(dd, 0x7f, sizeof(dd));
	scanf("%d%d",&n,&m);
	p = 1;
	for(int i = 1;i <= m;++i)
	{
		scanf("%d%d%d",&u,&v,&w);
		e1[++k] = (node){v, t[u], w}; 
		t[u] = k;
		e2[k] = (node){u, tt[v], w}; 
		tt[v] = k;
	}
	q.push(p);//起点插入队列 
	in[p] = 1;//记录到过这个点 
	d[p] = 0;//距离 
	while(!q.empty())//还有下一个点可以走 
	{
		int now = q.front();//现在在那个点 
			q.pop();//把这个点弹出去 
		for (int i = t[now]; i; i = e1[i].next)//枚举它所有到的点 
		{
			int y = e1[i].to;//到它的下一个点 
			if (d[now] + e1[i].x < d[y])//判断哪个距离短 
			{
				d[y] = d[now] + e1[i].x;//如果更短,就更新值 
				if (!in[y])//如果没有到过这个点(避免死循环) 
				{
					in[y] = 1;//标记它走过 
					q.push(y);//插入点继续走 
				}
			}
		}
		in[now] = 0;//把不在路径上的点的标记清除 
	}
	
	q.push(p);
	in[p] = 1;
	dd[p] = 0;
	while(!q.empty()) //如上所示反过来即可
	{
		int now = q.front();
		q.pop();
		for (int i = tt[now]; i; i = e2[i].next) 
		{
			int y = e2[i].to;
			if (dd[now] + e2[i].x < dd[y]) 
			{
				dd[y] = dd[now] + e2[i].x;
				if (!in[y]) 
				{
					in[y] = 1;
					q.push(y);
				}
			}
		}
		in[now] = 0;
	}
	
	for(int i = 1;i <= n; ++i)
		if(i != p) ans += d[i] + dd[i];
	printf("%d",ans);
	return 0;
} 
考虑柔性负荷的综合能源系统低碳经济优化调度【考虑碳交易机制】(Matlab代码实现)内容概要:本文围绕“考虑柔性负荷的综合能源系统低碳经济优化调度”展开,重点研究在碳交易机制下如何实现综合能源系统的低碳化与经济性协同优化。通过构建包含风电、光伏、储能、柔性负荷等多种能源形式的系统模型,结合碳交易成本与能源调度成本,提出优化调度策略,以降低碳排放并提升系统运行经济性。文中采用Matlab进行仿真代码实现,验证了所提模型在平衡能源供需、平抑可再生能源波动、引导柔性负荷参与调度等方面的有效性,为低碳能源系统的设计与运行提供了技术支撑。; 适合人群:具备一定电力系统、能源系统背景,熟悉Matlab编程,从事能源优化、低碳调度、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究碳交易机制对综合能源系统调度决策的影响;②实现柔性负荷在削峰填谷、促进可再生能源消纳中的作用;③掌握基于Matlab的能源系统建模与优化求解方法;④为实际综合能源项目提供低碳经济调度方案参考。; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重点关注目标函数设计、约束条件设置及碳交易成本的量化方式,可进一步扩展至多能互补、需求响应等场景进行二次开发与仿真验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值