bzoj2150 部落戰爭

2021-12-29 22:18:10 字數 2123 閱讀 9169

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。

有源匯有上下界最小流問題

把每個點i拆成兩個點i1和i2,分別表示入點和出點。對於每個點i連邊(s,i1,0,1) (i1,i2,1,1) (i2,t,0,1)。對於每條邊(i,j)連邊(i2,j1,0,1)。求從s到t的最小流。

#include

#include

#include

#include

#include

#include

#include

#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

#define ll long long

#define pa pair

#define maxn 5100

#define maxm 100000

#define inf 1000000000

#define f1(x,y) (x-1)*m+y

#define f2(x,y) (x-1+n)*m+y

using namespace std;

struct edge_type

e[maxm];

int head[maxn],cur[maxn],dis[maxn],a[55][55],in[maxn];

int n,m,r,c,s,t,ss,tt,cnt=1,maxflow;

char ch;

inline int read()

while (ch>='0'&&ch<='9')

return x*f;

}inline void add_edge(int x,int y,int v)

;head[x]=cnt;

e[++cnt]=(edge_type);head[y]=cnt;

}inline void insert(int x,int y,int l,int r)

inline void build()

}inline bool bfs()

} return false;

}inline int dfs(int x,int f)

} if (!sum) dis[x]=-1;

return sum;

}inline void dinic()

}inline int minflow()

int main()

; const int dy[4]=;

f(i,1,n) f(j,1,m)

f(i,1,n) f(j,1,m) if (a[i][j]) }

build();

add_edge(t,s,inf);

printf("%d\n",minflow());

}

BZOJ2150 部落戰爭

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

bzoj2150 部落戰爭

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

BZOJ2150 部落戰爭

題解 把每個點拆成入點和出點,因為必須經過一次且只能經過一次。所以在兩個點之間連一條上界 下界 1的邊。然後再s到每個入點連邊,每個出點向t連邊,點與點之間。求最小流就可以過了。感覺最小流神一般的存在。1 include2 include3 include4 include5 include6 in...