題解:
可以戳這裡:
其實自己yy一下就知道這樣建圖的正確性了。
感覺太神奇,居然還能拆成3個點
orzzzzzzzzzzzzzzzzzzzzzzzzz
跪跪跪跪跪跪跪跪
**:
1 #include2view code3 #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 }
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次交換,而路徑上...