HDU - 4725 The Shortest Path in Nya Graph 最短路,思维建图

题目链接

HDU-4725

题意

给定n个点m个带权双向道路,这n个点各自有一个叫层级的属性。相邻层级间的点可以通过花费c转移。求1-n最短路。

思路

这题可能是kuangbin这个专题里难度数一数二的了。思路很清晰,裸的最短路,难点在于建图。这个建图又和POJ - 2502里专门恶心人的建图不一样,是真的需要动脑子的。
关于层级,虽然层级范围是1-n,但没有告诉你一定是1-n全出现,也没有告诉你一个层级只有一个点。这意味着:

  • 离线处理变得困难
  • 只能连接相邻的两层,比如不加处理直接连接1-3层级,如果2层级不存在,那么这条路线是不可行的。

最容易想到的方法应该是两层for,但是n范围是1e5,肯定会t。这里我们选择为每一个层级建造一个层节点,有点类似于超级源点超级汇点。在线处理每一个节点,将这个节点所属的层节点向节点连单向边(如果双向,那么同一层级所有点相互移动的花费是0,显然会wa),之后再将这个节点向上下层级节点连接单向边。对于m条边正常连接,之后跑最短路即可
下附一张样例二图片,节点456代表层级123的层节点样例2

代码
#include<bits/stdc++.h>  
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
using namespace std;
	typedef long long ll;
	typedef pair <int,int> P;
	const int maxn=200500;
	const int maxe=800500;//开大点没坏处 ~ ~ 
	const int inf=0x3f3f3f3f;
	int head[maxn];
	struct Edge{
   
		int to;
		int next;
		int w;
	} edge[maxe];
	int cnt;
	int n
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值