HDU 3873 Invade the Mars

HDU 3873 Invade the Mars(灵活的dijstra魔改) 传送门 给定一张图,求111到nnn的最短路 进入到第iii城市当且仅当所有iii的子城市都被进入 而且由于从111出发的是一个军队,所以占领城市可以同时进行 非常灵活的一题…对于dijstradijstradijstra的魔改 因为每个点是有限制的,不能马上入队,只有当不受任何城市保护了才能入队更新别人 记录一下每个点还受多少点保护in[i]in[i]in[i],以及每个点保护了哪些点 那么每次从优先队列拿出一个不受保护的点uuu 所有受到点uuu保护的点的in[i]−−in[i]--in[i]−− 且 阅读详情

传送门

带限制最短路。(4月9日更新:这道题的依赖关系很像拓扑排序,注意体会)
一个有向图,给定起点终点,求结点依赖关系下的最短路。所谓结点依赖,是指每个结点i都依赖于零个或多个其他结点,结点i可访问当且仅当它依赖的这些结点都已经访问过。(可以确定的是,起点肯定不依赖于任何点,而且每个点都不可能依赖于自身)

还有,这道题边权的实际意义是时间。这一点和其他最短路的题都不一样!所以d[]数组代表的就是两点之间最短路花费的时间(不仅包括走每条边花的时间,还包括等的时间)。

这道题(只能? )用dijkstra完成,dijkstra最短路算法可以保证每次大循环找到的u点不重复(因为有vis[]数组控制着),每个点最多只当一次中介点。然后,某个点成为中介点的必要条件是它依赖的那些点都已经访问过(这里用数组cnt[]记录每个点依赖的那些结点还差几个没访问)。当找到一个合法的中介点以后,要更新所有的依赖这个中介点的那些结点(这里是依赖当前点的点,不是当前点依赖的点)的信息,首先这些点各自的cnt[]可以减一了,然后这些点的d[]如果小于d[u],则置为d[u](因为这些点依赖于中介点u,中介点被访问完才有可能访问这些点,所以这些点的d[]至少是d[u])。

上述说的有点绕,其实A依赖B的意思就是B城市里面装有A城市的屏障发生器。根据上述思想,我们需要统计A依赖的点的个数,以及B指向A的这个关系(也就是说通过B能找到A)。


#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string>
using namespace std;

const int INF = 1e9;
const int MAXN = 3001;
int N, M, T;

struct Edge
{
	int n, w;
};
vector<Edge> ve;
vector<int> v[MAXN];

vector<int> to[MAXN];
int cnt[MAXN];

int d[MAXN];
bool vis[MAXN];

void init()
{
	ve.clear();
	memset(cnt, 0, sizeof cnt);
	for (int i = 1; i <= N; i++)
	{
		v[i].clear();
		to[i].clear();
	}
}

void dijkstra(int s)
{
	memset(vis, 0, sizeof vis);
	fill(d + 1, d + N + 1, INF);
	d[s] = 0;
	for (int i = 0; i < N; i++)
	{
		int u = -1, mind = INF;
		for (int j = 1; j <= N; j++)
		{
			if (!cnt[j])                               ////
			{
				if (!vis[j] && d[j] < mind)
				{
					mind = d[j];
					u = j;
				}
			}
		}
		vis[u] = true;
		for (int j = 0; j < to[u].size(); j++)         ////  对dijkstra而言,u只当这么一次中介点
		{
			d[to[u][j]] = max(d[to[u][j]], d[u]);
			cnt[to[u][j]]--;
		}
		for (int j = 0; j < v[u].size(); j++)
		{
			int n = ve[v[u][j]].n;
			int w = ve[v[u][j]].w;
			if (!vis[n] && d[u] + w < d[n])
			{
				d[n] = d[u] + w;
			}
		}
	}
}

int main()
{
	int a, b, c;
	scanf("%d", &T);
	for (; T--;)
	{
		scanf("%d%d", &N, &M);
		init();
		for (int i = 0; i < M; i++)
		{
			scanf("%d%d%d", &a, &b, &c);
			ve.push_back(Edge{ b,c });
			v[a].push_back(i);
		}
		for (int i = 1; i <= N; i++)
		{
			scanf("%d", &a);
			for (; a--;)
			{
				scanf("%d", &b);
				cnt[i]++;                  // 当前城市i被多少个城市保护着
				to[b].push_back(i);        // 城市b保护当前城市i
			}
		}

		dijkstra(1);
		printf("%d\n", d[N]);
	}

	return 0;
}
STM32F0实现数字化SPWM纯正弦波逆变器 这个没啥好说的,搭电路的事。其核心思想是两边桥臂分别由两个180度相位差的正弦波与三角载波比较来控制,优点是在开关器件工作频率一样的情况下,输出PWM频率是单极性SPWM的2倍,能够明显减少谐波,因此只需要相对较小的电感和电容滤波器件就可以起到很好的滤波效果,提升了系统的性能,也精简了系统体积,降低了成本。而双极性pwm则是在整个正弦周期内,四只管子都在高频开关状态工作,对角线上的管子一起导通,另一对角线上管子互补导通,实际上只需要一路互补的PWM控制,负载上电压在正电压和负电压之间切换,不出现0v。 阅读详情

相关推荐

GX WORKS2通过交换机连接PLC的方法

三菱PLC连接方法的分享

weixin_64927621的博客 3619

HDU3873-有依赖的最短路(拓扑排序)

题目大意: 给一张图,跑最短路。但是每个点可能有前驱点集,即必须要先访问到前驱点,才能访问这个点. 题目思路: 可以发现,在这种限定条件下。我们访问节点的顺序一定是一个拓扑序. 所以思路是一边Dij一边拓扑排序.能够入列,当前仅当它的入度为0. 然后对着样例讨论一下, 竟 然 过 了 #include<bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int,int> #define p

qq_35577488的博客 322

ROS2机械臂MPC轨迹规划实战:从MoveIt 2插件配置到参数调优全流程

本文详细介绍了ROS2机械臂MPC轨迹规划的全流程,从MoveIt 2插件配置到参数调优。通过模型预测控制(MPC)技术,实现高精度运动控制,特别适合复杂装配任务。文章包含环境搭建、插件部署、参数设计及实战调优方法,帮助开发者快速掌握ROS2机械臂的MPC轨迹规划技术。

i0j1k2l3m的博客 206

hdu 3873(有节点保护的最短路)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3873 思路:题目意思很简单,就是说如果没有攻占保护x的城市,就不能攻占,我们可以用pro[x]记录保护x的所有城市被攻占的最早时间,那么能到x的最短时间为pro[x]和到达x的最短路中的较大者 .dij入队过程中只把In[x](没有被包含的城市)入队 对于出队的x,它的最短时间已经确定,表示已经被占...

weixin_33721344的博客 204

《我的Classic Platform AUTOSAR之路》 BSWM 模式管理(二)ESH

只有 PostRun 和 wakeup 才能切换到 RUN,其他状态需要先切换到 wakeup 模式。进入 RUN 模式需要打开通信 allow,退出 Run 需要 disable 通信 allow。Prepareshut 与 dem_shutdown 绑定,如果没有 dem 配置,不会生成。除了 Init 模式下,其他模式下都要检查 ECU 的唤醒源和通信 pending 需求。与 ECUM 相关,整个 ECU 状态管理的状态机制。postrun 可以不配置,需要根据自己的需求使能。

libuping2023的博客 964

2019年高教社杯全国大学生数学建模竞赛 C 题:《机场的出租车问题》真题解析与 MATLAB 解决方案

🏆 本文已收录于专栏:《滚雪球学数学建模(含历年真题)》,持续更新最新及历年数学建模竞赛资料,每篇内容力求做到“问题讲透、模型讲清、代码可用、论文可参考”,帮助你从零开始逐步建立完整的数学建模知识体系。

**My Coding Family** 3453

hdu3873 (优先队列)

本题对我而言算难题了, 遇到的问题 1 被保护点与保护点的存储问题,  解决方法  bf[a].push_back(i); i为被保护点, a为保护点,这样可以再占领a点时,很容易把a点保护的点删去, 2 对优先队列中出队列的点的含义比清楚,含义 此点应该是距离起点距离最近的, 且此不会再如队列。 3 应该把出队列的点的所有保护的城市的保护数减1 , 更重要的是把他保护的城市的最晚保护时间

Acder的专栏 789

计算机视觉安防监控升级:人脸识别与行为异常检测

计算机视觉安防监控升级:人脸识别与行为异常检测 ,人工智能,计算机视觉,大模型,AI,本文将深入探讨人脸识别与行为异常检测技术在安防监控中的应用,包括技术原理、算法实现、应用场景以及面临的挑战与解决方案。通过实际案例和代码示例,帮助读者更好地理解和掌握这些技术,为推动安防监控系统的智能化升级提供参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 23万+

HDU 3873 Invade the Mars (dijkstra变形)

http://acm.hdu.edu.cn/showproblem.php?pid=3873 这道题题意很简单,就是有的城市保护着某些城市,如果要入侵一个被保护的城市,要先入侵保护他的所有城市。问1到n的最短距离。 解法,用优先队列dijkstra跑。要注意的是建图的地方。 对于保护城市的建图,我们采用先读入li[i],然后读入li[i]保护其的城市u,把i放入G[u]中。 跑dijkst

llzhh的博客 515

C++ Qt6 QtQuick/QML入门进阶与项目实战视频教程

C++ Qt这些年在PC客户端、嵌入式、汽车座舱仪表等领域应用很广泛,例如剪映专业版、微信4.0、亿图脑图、Steam、美图秀秀、腾讯会议、钉钉(部分模块)等都是使用C++ QWidget/QML开发。特别是QML这种声明式UI开发更加快捷,QML的界面开发效率相对于QWidget更快速,界面效果更好,QtQuick/QML在Qt6版本也逐渐完善了,使用QML进行客户端开发是个不错的选择。

琅嬛福地 4487

FD.io/VPP — VPP 的实现原理解析

目录 文章目录目录VPPVPP 的关键创新技术数据报文的矢量处理标量报文处理方式I-cache miss 问题矢量数据报文处理方式标量 v.s. 矢量报文处理流程Packet Processing Graph(数据报文处理图)Packet Processing Graph 的处理流程Graph Node Plugin 机制 VPP WIKI:https://wiki.fd.io/view/VPP Docs:https://fd.io/docs/vpp/master/index.html Github:ht

烟云的计算 2593

HDU 3873 Invade the Mars dijkstra最短路

题意:从一个点出发到达一个终点,图为有向图。有一些特殊的点,他有很多的前驱点,只有当前驱点被攻占之后,才可以攻占这个点(这个点才可以通过),每条边的权值为花费的时间,攻占的军队无限,如果可以攻占就攻占,如果前驱点没有攻占完毕,那么军队就在这个城市的外围驻守,等待时间。 想法:攻占一个需要有前驱点的时候,要找到所有前驱点用时最多的和本身时间进行比较取最大值,然后此点方可通过。 #

猫ER 738

华为OD最新机试真题-池化资源共享

摘要:该问题要求管理n台设备的资源池,处理资源申请和释放操作。申请操作需返回满足条件且剩余资源最少的设备ID,释放操作需将指定申请的资源归还。采用线段树数据结构维护各设备当前最大可用资源值,支持快速查询和更新。线段树实现了单点修改、区间最大值查询以及查找最左满足条件的节点功能。算法时间复杂度为O((n+m)logn),空间复杂度O(n),适用于大规模操作。提供了C++、Java和Python三种实现方案。

面试高手的博客 324

【HDU】3873 Invade the Mars 最短路

传送门:【HDU】3873 Invade the Mars 题目分析:还真是有点意思的一道题,要求dao

poursoul 795

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

HDU 3873 Invade the Mars Dijkstra变种

Invade the Mars Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 365768/165536 K (Java/Others) Total Submission(s): 2136 Accepted Submission(s): 623 Problem Description It's now the year 21XX

LuRiCheng的博客 623

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

hdu 3873 Invade the Mars

题意:有n个城市,城市之间有有向路径连接,有的城市有可能被其他城市保护,如果保护它的城市没有被占领,那么该城市就不能被占领,但是可以在城市外等待,等保护它的城市占领后立即进入。求从1到n的最短路。   思路:这题读错好几次题意,蛋疼死了。开始想用spfa搞,但是总超时,然后看了看题解,写了dijkstra才过了。。大体思路就是用一个数组记录该城市没有被保护的时间,然后和最短路取较大的值。  

绝望的乐园 871

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Hdu 3873 Invade the Mars

Invade the MarsTime Limit: 5000/2000 MS (Java/Others)    Memory Limit: 365768/165536 K (Java/Others)Total Submission(s): 2283    Accepted Submission(s): 661Problem DescriptionIt's now the year 21XX,wh...

你身后的人 332

[hdu3873] Invade the Mars

题目链接题解:前驱点都走过才能入队#include <queue> #include <cstdio> #include <cstring> #include <iostream> using namespace std; #define INF 0x3f3f3f3f #define MP(x,y) make_pair(x,y) typedef pair<int,int> pii; priority

沙茶酱的代码库>__< 328

hdu 3873 Invade the Mars(dij变体,带限制最短路)

Invade the Mars Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 365768/165536 K (Java/Others) Total Submission(s): 1232    Accepted Submission(s): 351 Problem Description It's now the

WEYuLi的专栏 2233

hdu 3873 Invade the Mars 有保护节点的最短路

Problem Description It's now the year 21XX,when the earth will explode soon.The evil U.S. decided to invade the Mars to save their lives.

kongming_acm的专栏 860

hdu 3873 Invade the Mars(自写堆优化Dijkstra)

题意:以城市1为出发点,城市n为目的地,有若干条限制:要首先攻占城市a才能攻占城市b,问攻占城市n所需的最短时间。 从源点到任意一点的最短路受两个条件的限制:一是源点到自己的最短路,而是源点到限制点的最短路,即限制点最短路f[c] = Math.max(f[c], d[a]);最短路d[c] = Math.max(d[c], f[c]); 因此要确定所有限制点的最短路后才能使用该点松弛其它顶点

新博客地址:sensirly.github.io 824

Invade the Mars HDU - 3873 (最短路)题解

Invade the Mars HDU - 3873 (最短路)题解

Sega_hsj 's Blog 714

Invade the Mars HDU - 3873(最短路变体)

It’s now the year 21XX,when the earth will explode soon.The evil U.S. decided to invade the Mars to save their lives. But the childlike Marsmen never keeps any army,because war never take place on th

Coldfresh的博客 500

hdu 3873 Invade the Mars(heap + dij变形)

思路:题目意思很简单,就是说如果没有攻占保护x的城市,就不能攻占,我们可以用pro[x]记录保护x的所有城市被攻占的最早时间,那么能到x的最短时间为pro[x]和到达x的最短路中的较大者 .dij入队过程中只把In[x](没有被包含的城市)入队 对于出队的x,它的最短时间已经确定,表示已经被占领,它所保护的城市的保护度减 1,一旦某个被保护的城市的保护度为零且已经到底(未占领,d[x]!=inf

uuuuuu 797

HDU - 3873 Invade the Mars (带有限制的最短路)

Invade the Mars Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 365768/165536 K (Java/Others) Total Submission(s): 2695    Accepted Submission(s): 775 Problem Description It's now the year 2...

GYH0730的博客 366
上一篇: HDU 1839 Delay Constrained Maximum Capacity Path
下一篇: HDU 2962 Trucking
Crossing over
博客等级 码龄10年 6粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值