拆点
拆点顾名思义就是把点进行拆分比如一个点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

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

被折叠的 条评论
为什么被折叠?



