拆点

拆点是一种图论中的技巧,常用于处理有特殊条件的节点,如网络流中的有限制的点。通过拆点,可以将节点分为多个状态,增加图的复杂性以适应问题需求。例如,在分层图最短路问题中,每个节点可以看作有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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值