bzoj 2668 傳送門
重點在於對於每條轉移路徑:首尾算一次,中間節點算兩次
可以一點拆三點,將原流量拆成入流量和出流量
但其實也可以就拆兩點,分前後是否是一首尾點一普通點來確定是否有一條路徑只占用1流量
#include usingnamespace
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 行為初始狀態,每行為乙個包...