BZOJ2150 部落戰爭

2022-05-12 00:00:34 字數 2824 閱讀 5850

題解:

把每個點拆成入點和出點,因為必須經過一次且只能經過一次。所以在兩個點之間連一條上界=下界=1的邊。

然後再s到每個入點連邊,每個出點向t連邊,點與點之間。。。

求最小流就可以過了。。。

(感覺最小流神一般的存在。。。)

**:

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include

10 #include11 #include

12#define inf 1000000000

13#define maxn 100000+5

14#define maxm 100000+5

15#define eps 1e-10

16#define ll long long

17#define pa pair18

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

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

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

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

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

23#define mod 1000000007

24using

namespace

std;

25 inline int

read()

2629

while(ch>='

0'&&ch<='9')

30return x*f;31}

32int n,m,s,t,r,c,ss,tt,maxflow,tot=1,head[maxn],cur[maxn],h[maxn],in[maxn],num[100][100][2

];33 queueq;

34bool a[100][100

];35

struct edgee[maxm];

36 inline void ins(int x,int y,int

v)37

;head[x]=tot;

39 e[++tot]=(edge);head[y]=tot;40}

41 inline void insert(int x,int y,int l,int

r)42

45void

build()

4649

bool

bfs()

5061}62

return h[t]!=-1;63

}64int dfs(int x,int

f)65

76if(!used) h[x]=-1;77

return

used;78}

79void

dinic()

8086}87

intminflow()

8897

intmain()

98107 for1(i,n)for1(j,m)num[i][j][0]=num[i][j][1]=(i-1)*m+j,num[i][j][1]+=n*m;

108 s=0;t=2*n*m+1;ss=t+1;tt=t+2

;109 for1(i,n)for1(j,m)if

(a[i][j])

110124

build();

125 insert(t,s,0

,inf);

126 printf("

%d\n

",minflow());

127return0;

128 }

view code

time limit: 10 sec  memory limit: 259 mb

submit: 354  solved: 218

[submit][status]

lanzerb的部落在a國的上部,他們不滿天寒地凍的環境,於是準備向a國的下部征戰來獲得更大的領土。 a國是乙個m*n的矩陣,其中某些地方是城鎮,某些地方是高山深澗無人居住。lanzerb把自己的部落分成若干支軍隊,他們約定: 1. 每支軍隊可以從任意乙個城鎮出發,並只能從上往向下征戰,不能回頭。途中只能經過城鎮,不能經過高山深澗。 2. 如果某個城鎮被某支軍隊到過,則其他軍隊不能再去那個城鎮了。 3. 每支軍隊都可以在任意乙個城鎮停止征戰。 4. 所有軍隊都很奇怪,他們走的方法有點像西洋棋中的馬。不過馬每次只能走1*2的路線,而他們只能走r*c的路線。 lanzerb的野心使得他的目標是統一全國,但是兵力的限制使得他們在配備人手時力不從心。假設他們每支軍隊都能順利占領這支軍隊經過的所有城鎮,請你幫lanzerb算算至少要多少支軍隊才能完成統一全國的大業。

第一行包含4個整數m、n、r、c,意義見問題描述。接下來m行每行乙個長度為n的字串。如果某個字元是'.',表示這個地方是城鎮;如果這個字元時'x',表示這個地方是高山深澗。

輸出乙個整數,表示最少的軍隊個數。

【樣例輸入一】

3 3 1 2

....x.

...

【樣例輸入二】

5 4 1 1

....

..x.

...x

....

x...

【樣例輸出一】

4【樣例輸出二】

5【樣例說明】

【資料範圍】

100%的資料中,1<=m,n<=50,1<=r,c<=10。

bzoj2150 部落戰爭

lanzerb的部落在a國的上部,他們不滿天寒地凍的環境,於是準備向a國的下部征戰來獲得更大的領土。a國是乙個m n的矩陣,其中某些地方是城鎮,某些地方是高山深澗無人居住。lanzerb把自己的部落分成若干支軍隊,他們約定 1.每支軍隊可以從任意乙個城鎮出發,並只能從上往向下征戰,不能回頭。途中只能...

BZOJ2150 部落戰爭

bzoj2150 部落戰爭 lanzerb的部落在a國的上部,他們不滿天寒地凍的環境,於是準備向a國的下部征戰來獲得更大的領土。a國是一 個m n的矩陣,其中某些地方是城鎮,某些地方是高山深澗無人居住。lanzerb把自己的部落分成若干支軍隊,他們 約定 1.每支軍隊可以從任意乙個城鎮出發,並只能從...

bzoj2150 部落戰爭

補了一下匈牙利的各種騷操作。最大匹配等於最小覆蓋 最大獨立集 n 最小覆蓋 最大團 補圖的最大獨立集 對於這題,把每個點拆成兩個,可以到達的就連邊。我匈牙利的模版是真不熟。include include include include include include using namespace ...