bzoj2150: 部落戰爭
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',表示這個地方是高山深澗。
1<=m,n<=50,1<=r,c<=10。
輸出乙個整數,表示最少的軍隊個數。
【樣例輸入一】
3 3 1 2
....x.
...
【樣例輸入二】
5 4 1 1
....
..x.
...x
....
x...
【樣例輸出一】
4【樣例輸出二】
5感覺和這個題沒什麼區別啊:
於是直接暴力建邊然後跑二分圖匹配或者網路流不就好了?!
二分圖匹配:
#include#include#include#include#define maxn 2510#define maxm 60
#define max (1<<30)
using namespace std;
int n,m,r,c,c=1,t=0;
int head[maxn],f[maxn],vis[maxn],map[maxm][maxm];
struct edgea[maxn<<3];
inline int read()
while(c>='0'&&c<='9')
return date*w;
}inline int id(int x,int y)
inline bool check(int x,int y)
inline void add(int x,int y)
bool find(int x)
} return false;
}int solve()
return t-ans;
}void init()
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)if(map[i][j])
}int main()
網路流:
#include#include#include#include#define maxn 5010#define maxm 60
#define max (1<<30)
using namespace std;
int n,m,r,c,c=2,s,t,sum=0;
int head[maxn],deep[maxn],map[maxm][maxm];
struct edgea[maxn<<3];
inline int read()
while(c>='0'&&c<='9')
return date*w;
}inline int id(int x,int y)
inline bool check(int x,int y)
inline void add(int u,int v,int w)
bool bfs()
} }return false;
}int dfs(int x,int limit)
else deep[v]=-1;
} }return cost;
}int dinic()
void init()
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)if(map[i][j])
}int main()
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...