拆点

拆点是一种图论中的技巧,常用于处理有特殊条件的节点,如网络流中的有限制的点。通过拆点,可以将节点分为多个状态,增加图的复杂性以适应问题需求。例如,在分层图最短路问题中,每个节点可以看作有k+1种状态,对应0到k次0代价通过的机会。通过dp状态转移,可以解决这类问题。

拆点

拆点顾名思义就是把点进行拆分比如一个点i就可以划分为i1,i2,i3他们都代表着i但是是不同状态下的i,本来可能只有一条与i相连的边但是通过拆点之后可能会有很多不同状态的连线,代表了i在不同的方案中的位置,拆点后的图相比于原来的图会变得更大(因为他将每种的状态的连线都画了出来)。
比如网络流中的有流量限制的点的问题就可以用到拆点,可以将有限制的点拆成两点,在他们中间加上一条边,权值为限制值,就可以直接套用板子了。(还没学到网络流不展开讲了
另外一个应用就是分层最短路。
例题:
迷路

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int maxn = 1e6+10;
const int INF = 1e8;
const int mod = 2009;
int n,t; 
struct Matrix {
   
   
	int m[250][250];
	void clear() {
   
   
		memset(m,0,sizeof(m));
	}
};
int p(int i,int j) {
   
   
	return (i-1)*10+j;
}
Matrix multi(Matrix a,Matrix b) {
   
   
	Matrix res;
	res.clear();
	for(int i=1;i<=n;i++) {
   
   
		for(int j=1;j<=n;j++) {
   
   
			for(int k=1;k<=n;k++) {
   
   
				res.m[i][j] = (res.m[i][j] + a.m[i
### 关于最短路算法 最短路是一种特殊处理方式,在某些特定场景下可以有效解决问题。通常情况下,当遇到带有容量限制或者时间窗口约束等问题时,可以通过的方法将其转化为标准的最短路径问题。 #### 的概念及其作用 在一个图中,如果某个顶存在额外属性(比如通过该的最大次数),那么就可以考虑对该进行分操作。具体来说就是把原来的单个节分裂成多个子节,并设置合适的边权值连接这些新产生的节之间以及与其他原有节间的联系[^1]。 对于含有流量限制条件下的最短路径求解而言,利用网络流模型配合技术能够很好地满足需求。例如在网络传输过程中可能存在带宽瓶颈的情况;此时可以把具有限流特性的中间结分解为入度端口和出度端口两部分,再依据实际业务逻辑调整二者间连通性及权重参数从而构建起适用于此类情形的新图结构以便后续计算最优解方案[^2]。 #### 实现方法概述 为了实现上述思路中的转换过程,一般会遵循如下原则: - 对每一个需要被分割的目标位置创建若干副本; - 根据题目给定的信息设定好各个复制品之间的转移代价; - 将所有新建出来的实体按照一定规律重新组合起来形成一张新的拓扑关系网; - 应用常规意义上的寻径函数如 Dijkstra 或者 SPFA 来获取最终的结果集。 ```python def split_node(graph, node_id, capacity): """ Split a single node into two nodes with an edge between them. :param graph: Original adjacency list representation of the graph :type graph: dict[int, list[tuple(int, int)]] :param node_id: ID of the node to be split :type node_id: int :param capacity: Capacity limit on the new edge connecting the split parts :type capacity: int :return: Modified graph after splitting specified node and adding necessary edges :rtype: dict[int, list[tuple(int, int)]] """ # Create copies for incoming (in_) and outgoing (_out) connections from/to original point in_copy = f"{node_id}_in" out_copy = f"{node_id}_out" # Add these newly created points back into our working space along with their respective weights/capacities updated_graph = {**graph} updated_graph[in_copy] = [] updated_graph[out_copy] = [] # Transfer all pre-existing links pointing towards this location over to its 'input' counterpart instead, # while also establishing direct connection between input/output versions at fixed cost defined by user for neighbor, weight in graph[node_id]: updated_graph[in_copy].append((neighbor, weight)) updated_graph[in_copy].append((out_copy, capacity)) del updated_graph[node_id] return updated_graph ``` 此代码片段展示了如何基于字典形式表示的一张无向有权重图来进行指定编号节分工作。这里假设输入数据已经过适当预处理并符合预期格式要求。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值