BZOJ2668 cqoi2012 交換棋子

2022-05-12 00:00:33 字數 2601 閱讀 3213

題解:

可以戳這裡:

其實自己yy一下就知道這樣建圖的正確性了。

感覺太神奇,居然還能拆成3個點

orzzzzzzzzzzzzzzzzzzzzzzzzz

跪跪跪跪跪跪跪跪

**:

1 #include2

3 #include4

5 #include6

7 #include8

9 #include10

11 #include12

13 #include14

15 #include16

17 #include

1819 #include20

21 #include

2223

#define inf 1000000000

2425

#define maxn 200000+5

2627

#define maxm 200000+5

2829

#define eps 1e-10

3031

#define ll long long

3233

#define pa pair34

35#define for0(i,n) for(int i=0;i<=(n);i++)

3637

#define for1(i,n) for(int i=1;i<=(n);i++)

3839

#define for2(i,x,y) for(int i=(x);i<=(y);i++)

4041

#define for3(i,x,y) for(int i=(x);i>=(y);i--)

4243

#define for4(i,x) for(int i=head[x],y;i;i=e[i].next)

4445

#define mod 1000000007

4647

using

namespace

std;

4849 inline int

read()

5051

5657

while(ch>='

0'&&ch<='9')

5859

return x*f;

6061}62

int n,m,k,mincost,tot,s,t,head[maxn],d[maxn],from[2*maxm];

63bool

v[maxn];

64 queueq;

65int a[100][100][3],num[100][100][3],cnt[3

];66

struct edgee[2*maxm];

67void add(int x,int y,int v,int

c)68

;head[x]=tot;

70 e[++tot]=(edge);head[y]=tot;71}

72bool

spfa()

7375 q.push(s);d[s]=0;v[s]=1;76

while(!q.empty())

7784}85

}86return d[t]!=inf;87}

88void

mcf()

8997}98

}99const

int dx[8]=;

100const

int dy[8]=;

101102

intmain()

103104

115//

cout<116 tot=1

;117

for1(i,n)for1(j,m)

118126

else

if(a[i][j][1

])127

132else

133137 for0(k,7

)138

143}

144if(cnt[0]!=cnt[1])

145mcf();

146 printf("

%d\n

",mincost);

147148

return0;

149150 }

view code

time limit: 3 sec  memory limit: 128 mb

submit: 673  solved: 235

[submit][status]

有乙個n行m列的黑白棋盤,你每次可以交換兩個相鄰格仔(相鄰是指有公共邊或公共頂點)中的棋子,最終達到目標狀態。要求第i行第j列的格仔只能參與mi,j

次交換。

第一行包含兩個整數n,m(1<=n, m

<=20)。以下n行為初始狀態,每行為乙個包含m個字元的01串,其中0表示黑色棋子,1表示白色棋子。以下n行為目標狀態,格式同初始狀態。以下n行每行為乙個包含m個0~9數字的字串,表示每個格仔參與交換的次數上限。

輸出僅一行,為最小交換總次數。如果無解,輸出-1。

3 3110

000001

000110

100222

222222

4

BZOJ 2668 cqoi2012 交換棋子

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

bzoj2668 cqoi2012 交換棋子

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

bzoj2668 cqoi2012 交換棋子

費用流題,構圖非常巧妙。考慮每個點的交換限制的約束,一看就知道是點容量,但是這裡不是一分為二,而是一分為三。首先我們把問題化簡,變成對於原圖上所有黑點,找到乙個新圖中的黑點,進行多次交換後到達。我們看到多次交換實際上是走了一條路徑 這裡不是最短路 對於這條路徑的起點和終點,僅進行了1次交換,而路徑上...