BZOJ 2668 交換棋子

2022-05-13 10:18:17 字數 1223 閱讀 7217

bzoj 2668 傳送門

重點在於對於每條轉移路徑:首尾算一次,中間節點算兩次

可以一點拆三點,將原流量拆成入流量和出流量

但其實也可以就拆兩點,分前後是否是一首尾點一普通點來確定是否有一條路徑只占用1流量

#include using

namespace

std;

#define x first

#define y secondtypedef

long

long

ll;typedef pair

p;const

int maxn=1e5+10,inf=1

<<30

;int n,m,cnt1,cnt2;char dat[2][30][30],lmt[30][30

];namespace

mcmf

; vector

a[maxn];

ints,t,h[maxn],dist[maxn],prev[maxn],pree[maxn],maxf,minc;

void add_edge(int

from,int to,int cap,int

cost)

);a[to].push_back(edge);

}void min_cost_flow(int

f)

}if(dist[t]==inf) break

;

for(int i=1;i<=t;i++) h[i]+=dist[i];

int d=f;

for(int i=t;i!=s;i=prev[i])

d=min(d,a[prev[i]][pree[i]].cap);

f-=d;minc+=d*h[t];maxf+=d;

for(int i=t;i!=s;i=prev[i])}}

}using

namespace

mcmf;

int dx=;

int dy=;

int idx(int x,int y,int z)

intmain()

}min_cost_flow(inf);

if(cnt1!=cnt2||maxf!=cnt1) puts("-1"

);

else printf("%d"

,minc);

return0;

}

BZOJ 2668 cqoi2012 交換棋子

time limit 3 sec memory limit 128 mb submit 1112 solved 409 submit status discuss 有乙個n行m列的黑白棋盤,你每次可以交換兩個相鄰格仔 相鄰是指有公共邊或公共頂點 中的棋子,最終達到目標狀態。要求第i行第j列的格仔只能...

BZOJ2668 cqoi2012 交換棋子

題解 可以戳這裡 其實自己yy一下就知道這樣建圖的正確性了。感覺太神奇,居然還能拆成3個點 orzzzzzzzzzzzzzzzzzzzzzzzzz 跪跪跪跪跪跪跪跪 1 include2 3 include4 5 include6 7 include8 9 include10 11 include1...

bzoj2668 cqoi2012 交換棋子

description 有乙個 n 行 m 列的黑白棋盤,你每次可以交換兩個相鄰格仔 相鄰是指有公共邊或公共頂點 中的棋子,最終達到目標狀態。要求第 i 行第 j 列的格仔只能參與 m 次交換。input 第一行包含兩個整數 n,m 1 le n,m le 20 以下 n 行為初始狀態,每行為乙個包...